2013-05-04 70 views
1

我有一個單一的Sammy路線,可識別任意數量的參數。路線如下所示:Sammy.js與Knockout.js不運行路線與每個URL更改

get(/^\/(?:\?[^#]*)?#page\/?((?:[^\:\/]+\:[^\:\/]+\/?)*)$/g, function() { 
    var params = {}; 
    var splat = this.params.splat[0]; 
    var re = /([^\:\/]+)\:([^\:\/]+)/g; 
    match = true 
    while(match = re.exec(splat)) { 
     params[match[1]] = match[2]; 
    } 
    self.loadData(params); 
}); 

此代碼有效。它所做的是識別#page/param1:value1/param2:value2/模式的任意數量參數的路徑。我的loadData函數具有許多這些參數的默認值。我相信這些頁面的實際加載沒有問題,因爲它在許多瀏覽器的許多計算機上都可以100%地工作。然而,它在我的Android瀏覽器和我朋友的Mac的Safari和Chrome(適用於我的PC的Chrome)上有奇怪的行爲。我注意到這些是Webkit瀏覽器。

其行爲是路由爲第一個URL更改正確運行,然後不會進行下一個URL更改(儘管瀏覽器欄中的URL確實總是更改),然後它將再次運行第三個一個,而不是第四個。也就是說,它每隔一個時間工作。這對我來說似乎是非常奇怪的行爲,而且我對如何調試這一點感到不知所措。對於某些鏈接,我能夠運行黑客,因此點擊時我將窗口位置設置爲URL,並強制運行runRoute('get', url);的sammy代碼。必須爲頁面上的每個點擊事件添加此功能是不切實際的,而且這並不能真正說明所有URL更改。有沒有什麼我可以做的調試爲什麼我的路線沒有在每次URL改變時都運行?

回答

0

對於那些遇到類似行爲的人,在上述瀏覽器中每隔一次點擊,this.params.splat未定義。它應該設置爲URL的匹配部分(例如/#page/param1:value1/)。

我想出了對付這種情況的黑客是把它添加到GET路線的頂部:

if(this.params.splat === undefined) { 
    app.unload().run(); 
    return; 
} 

這不找到問題的根源,它只是一個黑客工具,允許它重新運行路線,以便params.splat在下次通過時不會被定義。如果任何人有更多關於正在發生的事情的信息,我會感興趣。