2013-08-31 22 views
7

Niedawno zacząłem używać knockout.js i sammy.js do modernizacji mojej aplikacji. Jednak utknąłem z pewnymi problemami.zablokuj sammy.js przed kradzieżą "prawdziwych linków"

Mam kilka ważnych linków na stronie - użytkownicy powinni rzeczywiście nawigować do tej lokalizacji, zamiast naśladować zachowania nawigacyjne za pomocą sammy.js. Chcę, aby tylko linki oparte na hashach były kierowane przez sammy.js, ale przechwytują też linki, które nie zawierają żadnych skrótów.

na przykład przechwytuje <a href="/logout">logout</a>.

część js że robi routing jest:

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

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

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

myślę this.get('' ..) część jest winowajcą, że wywołuje to zachowanie - Dostałem go od samouczka knockout.js, który mówi, że jest to konieczne, aby umożliwić użytkownikom z innych źródeł, aby prawidłowo przeglądać moją stronę. stroną uruchamianą przez kod knockout.js jest /w/. Chcę, aby sammy.js działał tylko w /w/ lub przynajmniej pozwolił użytkownikom na nawigację do /logout. Jak mogę to zrobić?

+0

Czy kiedykolwiek rozwiązałeś to? Jeśli nie, zdecydowanie poleciłbym odtworzyć to na [jsfiddle] (http://jsfiddle.net/). – edhedges

+0

@edhedges Uważam, że chodzi o definiowanie punktów początkowych aplikacji internetowej. moja aplikacja to tradycyjna wielostronicowa aplikacja, która ma HTML-y wygenerowane z serwera Pythona (i do pewnego stopnia wykorzystuje sammy.js i hash + ajax). więc, moim rozwiązaniem było usunięcie 'this.get ('', ...)' i wstawienie 'location.href = '. teraz nie-hashowe adresy URL nie są przechwytywane. – thkang

+0

Powinieneś odpowiedzieć sobie na pytanie dla innych, jeśli je rozwiązałeś. – edhedges

Odpowiedz

1

Możesz użyć funkcji "dookoła". Istnieje wiele opcji. Proponuję wykonać następujące czynności:

Pozwolić, że istnieje kilka adresów URL. Po naciśnięciu tego adresu URL chcesz przekazać serwer do strony. Na przykład wyloguj się z adresu URL, np. "/ Logout".

teraz dokonać tego adresu URL następująco

"/logout?reload=true" 

tak, że można kontrolować przez następujący kod Sammy'ego

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

Zapomniałeś zadzwonić do oddzwaniania, więc nic by się nie stało, gdyby nie było przeładowania. Byłem tak wolny, że edytowałem twoją odpowiedź. Teraz działa jak w reklamie! Dzięki! – user562529

0

Znalazłem, że jeśli porównuję window.loc do kopii lokalizacji okna przechowywanej podczas uruchamiania, mogę bezpiecznie uciec pułapce Sammy'ego. Jeśli adresy bazowe są zgodne, uruchamiam trasę podstawową. Jeśli nie pasują, ponownie załaduję window.location i wyładuję 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();