我最近开始使用knockout.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 :(得分:10)
我使用Sammy已经有一段时间,但我认为您可以使用disable_push_state
设置关闭此行为:
Sammy(function() {
this.disable_push_state = true;
...
});
答案 1 :(得分:1)
您可以使用“around”功能。有很多选择。我建议如下,
假设有一些网址。在点击该URL时,您希望将服务器与页面进行通信。例如,注销网址如“/ logout”。
现在按以下方式制作该网址
"/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()
答案 2 :(得分:0)
我发现如果我将window.location与启动时存储的窗口位置的副本进行比较,我可以安全地逃脱Sammy陷阱。如果基本网址匹配,我运行基本路由。如果它们不匹配,我重新加载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();