2013-08-31 46 views
7

我最近開始使用knockout.js和sammy.js來更新我的應用程序。但是我遇到了一些問題。阻止sammy.js竊取'真實鏈接'

我在頁面上有一些有效的鏈接 - 用戶應該實際導航到該位置,而不是模仿導航行爲使用sammy.js。我只希望基於散列的鏈接由sammy.js路由,但它也攔截不包含任何散列的鏈接。例如,它攔截<a href="/logout">logout</a>

,做路由JS部分是:

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

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

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

我覺得this.get('' ..)部分是調用此行爲的罪魁禍首 - 我是從knockout.js教程,它說,該行是必要的,以允許用戶從其他來源到正確瀏覽我的網頁。由knockout.js代碼運行的頁面是/w/。我希望sammy.js只能在/w/中工作,或者至少允許用戶導航到/logout。我怎樣才能做到這一點?

+0

你有沒有解決過這個問題?如果不是,我肯定會推薦在[jsfiddle](http://jsfiddle.net/)上重現這一點。 – edhedges

+0

@hedhedges我認爲這是關於定義您的Web應用程序的入口點。我的應用程序是傳統的多頁面應用程序,它具有從python web服務器生成的HTML(並在一定程度上利用sammy.js和hash + ajax)。所以,我的解決方案是刪除'this.get('',...)'並把'location.href = <一些散列我想要這個頁面,這是從服務器生成'''。現在非哈希URL不被攔截。 – thkang

+0

如果你已經解決了問題,你應該爲他人自己回答問題。 – edhedges

回答

1

您可以使用「around」功能。有很多選擇。我建議如下,

假設有一些網址。點擊該網址時,您想要將服務器與網頁進行通信。例如,註銷url,如「/註銷」。

現在作出這樣的網址如下

"/logout?reload=true" 

這樣,您可以通過以下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

你忘了撥打回撥電話,因此如果沒有重新加載,就什麼也不會發生。我非常自由地編輯你的答案。現在它按照廣告的方式工作!謝謝! – user562529

10

已經有一段時間,因爲我用薩米控制,但我認爲你可以關閉這個行爲與disable_push_state設置:

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

我發現如果我比較window.loc在啓動時存儲窗口位置的副本,我可以安全地逃脫薩米陷阱。如果基地址匹配,我運行基地路線。如果它們不匹配,我重新加載window.location並卸載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();