2013-08-31 5 views
7

Недавно я начал использовать knockout.js и sammy.js для модернизации своего приложения. Однако я столкнулся с некоторыми проблемами.блок sammy.js от кражи 'реальных ссылок'

У меня есть действующие ссылки на странице - пользователи должны фактически перейти к этому местоположению, вместо имитации поведения навигации с использованием sammy.js. Я хочу, чтобы только связанные с хешем ссылки были перенаправлены sammy.js, но также перехватывает ссылки, которые не содержат хешей.

например, перехватывает <a href="/logout">logout</a>.

, ИСЫ часть, которая делает маршрутизацию является:

Sammy(function() { 
    this.get('#/', function() { 
     ... 
    }); 

    this.get('#:id', function() { 
     ... 
    }); 

    this.get('', function() { this.app.runRoute('get', '#/') }); 
}).run(); 

Я думаю this.get('' ..) части является виновником, который вызывает такое поведение - я получил его от knockout.js учебника, в котором говорится, что линия необходима, чтобы позволить пользователям из другого источника, чтобы правильно просматривать мою веб-страницу. страница, которой управляет код knockout.js, - /w/. Я хочу, чтобы sammy.js работал только в /w/ или, по крайней мере, позволял пользователям перейти на /logout. Как я могу это сделать?

+0

Вы когда-нибудь решали это? Если нет, я определенно рекомендую воспроизвести это на [jsfiddle] (http://jsfiddle.net/). – edhedges

+0

@edhedges Я думаю, что это касается определения точек входа вашего веб-приложения. мое приложение является традиционным многостраничным приложением, которое имеет HTML-файлы, созданные с веб-сервера python (и в некоторой степени использует sammy.js и hash + ajax). поэтому, мое решение для этого было удалить 'this.get ('', ...)' и поместить 'location.href = <некоторый хэш, который я хочу для этой страницы, которая сгенерирована с сервера>'. теперь не-хэш-коды не перехватываются. – thkang

+0

Вы должны ответить на вопрос самостоятельно ради других, если вы его разрешили. – edhedges

ответ

1

Вы можете использовать функцию «вокруг». Существует много вариантов. Я предлагаю сделать следующее:

Предположим, что есть некоторые URL-адреса. При ударе этого URL-адреса вы хотите передать сервер на страницу. Например, logout url как "/ logout".

Теперь сделать этот URL следующим образом

"/logout?reload=true" 

Так что, вы можете контролировать с помощью следующего кода Сэмми

Sammy(function(){ 

    this.around(function(callback) { 
     if(this.params.reload === 'true')  
      location.replace(this.path); 
     else 
      callback(); 
    }); 
    // Your routers are going to be here 

}).run() 
+0

Вы забыли вызвать обратный вызов, так что ничего не произойдет вообще, если не будет перезагрузки. Я был настолько свободен, чтобы отредактировать ваш ответ. Теперь он работает как рекламируемый! Благодаря! – user562529

10

Давненько я Сэмми, но я думаю, что вы можете отключить эту поведение с disable_push_state установка:

Sammy(function() { 
    this.disable_push_state = true; 
    ... 
}); 
0

Я обнаружил, что если я сравниваю window.loc на копии копии окна, хранящегося при запуске, я могу безопасно избежать ловушки Сэмми. Если базовые URL совпадают, я запускаю базовый маршрут. Если они не совпадают, я перезагружаю window.location и выгружаю Sammy.js.

function myUrl() { 
    var url= window.location.href; 
    if (window.location.hash) { 
     url= url.replace(window.location.hash, ""); 
    } 
    if (window.location.search) { 
     url= url.replace(window.location.search, ""); 
    } 
    return url; 
} 

... 

Sammy(function() { 

    var myLocation = myUrl(); 

    ... 

    this.get('', function() { 
     if (myLocation === myUrl()) { 
      this.app.runRoute('get', '#/'); 
     } else { 
      window.location.reload(true); 
      this.unload(); 
     } 
    }); 
}).run();