7

我最近开始使用 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. 我怎样才能做到这一点?

4

3 回答 3

10

自从我使用 Sammy 以来已经有一段时间了,但我认为您可以使用以下设置关闭此行为disable_push_state

Sammy(function() {
  this.disable_push_state = true;
  ...
});
于 2013-11-07T16:36:58.617 回答
1

您可以使用“环绕”功能。有很多选择。我建议这样做,

假设有一些网址。在点击该 url 时,您希望将服务器与页面通信。例如,像“/logout”这样的注销 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()
于 2013-11-07T16:25:15.610 回答
0

我发现如果我将 window.location 与启动时存储的窗口位置的副本进行比较,我可以安全地逃脱 Sammy 陷阱。如果基本 url 匹配,我运行基本路由。如果它们不匹配,我会重新加载 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();
于 2014-05-28T20:14:39.190 回答