【问题标题】:Callback after .swap() not working - ASP.NET SPA w/sammy.js.swap() 不工作后的回调 - ASP.NET SPA w/sammy.js
【发布时间】:2015-03-17 22:20:35
【问题描述】:

我正在使用 ASP.NET 和 sammy.js 构建一个单页应用程序,其中除了 Home/Index 视图之外的所有视图都呈现为部分视图,以便 sammy 可以用部分视图交换主体的内容即返回。

我正在使用here 给出的示例,一切正常加载。

与上面的示例类似,在我的主页/索引页面中,我引用了一个名为 routing.js 的脚本,它包装了 sammy 函数调用以解析 MVC 路由:

var Routing = function (appRoot, contentSelector, defaultRoute) {

    function getUrlFromHash(hash) {
        var url = hash.replace('#/', '');
        if (url === appRoot)
            url = defaultRoute;
        return url;
    }

    return {
        init: function () {
            Sammy(contentSelector, function () {
                this.get(/\#\/(.*)/, function (context) {
                    var url = getUrlFromHash(context.path);
                    context.load(url).swap();
                });
            }).run('#/');
        }
    };
}

我需要在内容交换完全完成后调用回调函数,以便在新呈现的内容上实现进一步的 jQuery 功能。我的困境是,无论我从 sammy.js 文档中尝试什么选项,在交换内容后似乎都没有运行回调。

我已经尝试了以下所有方法(根据 sammy.js 文档传递回调的所有“有效”方式):

content.load(url).swap(pageLoadScripts(url));
content.load(url).swap().onComplete(pageLoadScripts(url));
content.load(url).swap().then(pageLoadScripts(url));
content.load(url).swap().next(pageLoadScripts(url));
content.load(url,pageLoadScripts(url)).swap();

甚至

content.load(url).swap();
pageLoadScripts(url);

在任何情况下,pageLoadScripts 函数都会在内容被交换之前触发。有什么不同的想法或建议吗?

【问题讨论】:

  • 你有没有为这个问题找到合适的解决方案?有同样的问题。

标签: asp.net-mvc sammy.js


【解决方案1】:

这有点小技巧,但它确实有效。

在 Sammy 初始化函数中,我在对 get 函数的覆盖之前向 swap 函数添加了以下覆盖:

this.swap = function (content, callback) {
    var context = this;
    context.$element().html(content);
    pageLoadScripts(hashedUrl);
};

FWIW,我仍然无法将回调设置为“未定义”以外的任何内容,即使在此覆盖函数中也是如此。

【讨论】:

    【解决方案2】:

    设法让这个工作:

    // override for callback after page load
    this.swap = function(content, callback) {
        this.$element().html(content);
        if (callback) {
            callback();
        }
    };
    
    // users
    this.get('/#/users', function(context) {
        context.load('/users').swap(function() { replaceBindings(viewModel.users); });
    });
    

    我设法通过将回调参数包装在另一个函数中来使其不是“未定义”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多