2013-08-31 10 views
7

Kısa süre önce benim app modernleştirmek için knockout.js ve sammy.js kullanmaya başladı. Ancak bazı problemlerle sıkışıp kaldım.sammy.js 'gerçek bağlantılar' çalmasını engelledi

Sayfada bazı geçerli bağlantılar var - kullanıcılar, sammy.js kullanarak gezinme davranışlarını taklit etmek yerine aslında bu konuma gitmelidir. Sadece karma tabanlı bağlantıların sammy.js tarafından yönlendirilmesini istiyorum, ancak aynı zamanda herhangi bir karma içermeyen bağlantıları da engelliyor. Örneğin, <a href="/logout">logout</a>'u kesiştirir, örneğin, . yönlendirme yapar

js parçasıdır:

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

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

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

Ben this.get('' ..) bölüm bu davranışı çağırır suçlu olduğunu düşünüyorum - Ben hat kullanıcılarına izin vermek için gerekli olduğunu söylüyor knockout.js öğretici, aldım diğer kökenlerden web sayfama düzgün bir şekilde göz atmak için. knockout.js kodu tarafından çalıştırılan sayfa /w/'dur. Sammy.js'nin yalnızca /w/'da çalışmasını veya en azından kullanıcıların /logout adresine gitmesine izin vermesini istiyorum. Bunu nasıl başarabilirim?

+0

Bunu hiç çözdünüz mü? Değilse ben kesinlikle bunu [jsfiddle] (http://jsfiddle.net/) üzerinde yeniden öneriyoruz. – edhedges

+0

@edhedges Bunun web uygulamanızın giriş noktalarını tanımlamakla ilgili olduğunu düşünüyorum. Uygulamam, bir python web sunucusundan oluşturulan HTML'lere sahip geleneksel çok sayfalı bir uygulamadır (ve bir ölçüde sammy.js ve hash + ajax'ı kullanır). Bu yüzden, benim bu çözüme 'this.get ('', ...)' ve 'location.href = thkang

+0

Sorunu çözdüyseniz, başkaları için soruyu kendiniz yanıtlamalısınız. – edhedges

cevap

1

"Around" işlevini kullanabilirsiniz. Çok fazla seçenek var. Aşağıdaki gibi yapılmasını öneririm: Bazı URL'ler olduğu varsayılsın. Bu URL'ye isabet ettirmekle, sunucuyu sayfaya iletmek istiyorsunuz. Örneğin, çıkış URL'si "/ logout" gibi. Böylece

"/logout?reload=true" 

şöyle Şimdi

o url yapmak, ne Sammy kullanılan beri

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

Geri aramayı çağırmayı unutmuşsunuz, bu nedenle yeniden yükleme yapılmadığında hiçbir şey olmazdı. Cevabınızı düzenlemek için çok özgürtüm. Şimdi ilan edildiği gibi çalışıyor! Teşekkürler! – user562529

10

, böyleyken Sammy'nin kod takip ederek kontrol edebilirsiniz, ama bu kapatabilirsiniz düşünüyorum disable_push_state ayarıyla davranışı:

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

buldum ben window.loc karşılaştırırsanız Başlangıçta depolanan pencere konumunun bir kopyasına ation, ben güvenli şekilde Sammy tuzak kaçabilir. Temel URL'ler eşleşiyorsa, temel rotayı çalıştırıyorum. Eşleşmezlerse window.location dosyasını yeniden yüklerim ve Sammy.js'yi kaldırırım.

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();