2013-08-31 7 views
7

Recentemente ho iniziato a utilizzare knockout.js e sammy.js per modernizzare la mia app. Tuttavia sono rimasto bloccato con alcuni problemi.blocca sammy.js dal furto di "link reali"

Ho alcuni collegamenti validi sulla pagina: gli utenti dovrebbero effettivamente navigare verso quella posizione, invece di imitare i comportamenti di navigazione usando sammy.js. Voglio che solo i collegamenti basati su hash vengano instradati da sammy.js, ma intercettano anche collegamenti che non contengono alcun hash.

ad esempio, intercetta <a href="/logout">logout</a>.

la parte che fa js routing è:

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

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

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

Penso this.get('' ..) parte è il colpevole che richiama questo comportamento - l'ho presa da knockout.js tutorial, che dice che la linea è necessaria per consentire agli utenti da altre origini per navigare correttamente nella mia pagina web. la pagina eseguita dal codice di knockout.js è /w/. Voglio che sammy.js funzioni solo su /w/ o, almeno, permetta agli utenti di navigare su /logout. Come posso realizzare questo?

+0

Hai mai risolto questo? Altrimenti consiglio di riprodurlo su [jsfiddle] (http://jsfiddle.net/). – edhedges

+0

@edhedges Penso che si tratti di definire i punti di ingresso della tua app web. la mia app è l'app tradizionale multi-pagina che ha generato HTML da un server web python (e sfrutta sammy.js e hash + ajax in una certa misura). quindi, la mia soluzione era rimuovere 'this.get ('', ...)' e inserire 'location.href = '. ora gli URL non hash non vengono intercettati. – thkang

+0

Dovresti rispondere tu stesso alla domanda per il bene altrui se lo hai risolto. – edhedges

risposta

1

È possibile utilizzare la funzione "intorno". Ci sono molte opzioni. Suggerisco di fare quanto segue,

Supponiamo che ci siano alcuni URL. Al raggiungimento di tale URL, si desidera comunicare il server alla pagina. Ad esempio, url di logout come "/ logout".

Ora fate che url come segue

"/logout?reload=true" 

Così, è possibile controllare dal seguente codice di Sammy

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

Hai dimenticato di chiamare il callback, quindi non sarebbe successo nulla se non ci fosse stato ricaricare. Ero così libero da modificare la tua risposta. Ora funziona come pubblicizzato! Grazie! – user562529

10

Stato un po 'da quando ho usato Sammy, ma penso che è possibile disattivare questa comportamento con l'impostazione disable_push_state:

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

Ho trovato che se confronto il window.loc per la copia della posizione della finestra memorizzata all'avvio, posso tranquillamente scappare dalla trappola Sammy. Se gli URL base corrispondono, eseguo la rotta di base. Se non corrispondono, ricarico il window.location e scarico 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(); 
Problemi correlati