2013-08-31 3 views
7

Ich begann vor kurzem mit knockout.js und sammy.js meine App zu modernisieren. Allerdings bin ich mit einigen Problemen stecken geblieben.Block sammy.js von 'echten Links' zu stehlen

Ich habe einige gültige Links auf der Seite - Benutzer sollten tatsächlich zu diesem Ort navigieren, anstatt Navigationsverhalten mit sammy.js zu imitieren. Ich möchte, dass nur Hash-basierte Links von sammy.js geroutet werden, aber es fängt auch Links ab, die keine Hashes enthalten.

zum Beispiel fängt es <a href="/logout">logout</a> ab.

die js Teil, das Routing hat folgende Funktionen:

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

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

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

Ich denke this.get('' ..) Teil der Schuld daran ist, dass dieses Verhalten ruft - ich habe es aus knockout.js Tutorial bekam, die besagt, dass die Leitung notwendig ist, um Benutzern zu ermöglichen von anderen Ursprüngen, um meine Webseite richtig zu durchsuchen. Die Seite, die von knockout.js Code ausgeführt wird, ist /w/. Ich will sammy.js nur in /w/ arbeiten oder zumindest Benutzern ermöglichen, zu /logout zu navigieren. Wie kann ich das erreichen?

+0

Haben Sie das jemals gelöst? Wenn nicht, würde ich definitiv empfehlen, dies auf [jsfiddle] (http://jsfiddle.net/) zu reproduzieren. – edhedges

+0

@edhedges Ich denke, es geht darum, Einstiegspunkte für deine Web-App zu definieren. Meine App ist eine traditionelle mehrseitige App, die HTMLs von einem Python-Webserver generiert (und sammy.js und hash + ajax zu einem gewissen Grad nutzt). Also, meine Lösung zu diesem war entfernen 'this.get ('', ...)' und put 'location.href = '. Jetzt werden Nicht-Hash-URLs nicht abgefangen. – thkang

+0

Sie sollten die Frage selbst für andere willen beantworten, wenn Sie es gelöst haben. – edhedges

Antwort

1

Sie können die Funktion "um" verwenden. Es gibt viele Möglichkeiten. Ich schlage vor, wie folgt zu tun,

Lassen Sie uns annehmen, dass es einige URLs gibt. Wenn Sie diese URL treffen, möchten Sie den Server mit der Seite kommunizieren. Beispiel: URL abmelden wie "/ abmelden".

nun, dass url machen als

"/logout?reload=true" 

folgt Damit können Sie durch die folgenden Sammy Code steuern

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

Sie haben vergessen, den Rückruf anzurufen, so dass überhaupt nichts passieren würde, wenn es kein Nachladen gäbe. Ich war so frei, deine Antwort zu bearbeiten. Jetzt funktioniert es wie angekündigt! Vielen Dank! – user562529

10

Schon eine Weile, da ich Sammy verwendet, aber ich glaube, Sie dies ausschalten Verhalten mit der disable_push_state Einstellung:

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

ich fand, dass, wenn ich vergleiche die window.loc Wenn ich die Kopie des Fensterortes beim Start abspeicherte, konnte ich der Sammelfalle entkommen. Wenn die Basis-URLs übereinstimmen, führe ich die Basisroute aus. Wenn sie nicht übereinstimmen, lade ich die window.location neu und entlade 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(); 
Verwandte Themen