.swap()无效后回调 - ASP.NET SPA w / sammy.js

时间:2015-03-17 22:20:36

标签: asp.net-mvc sammy.js

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

我正在使用给定here的示例,并且所有内容都按预期正常加载。

与上面的示例类似,在我的Home / Index页面中,我引用了一个名为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函数在交换内容之前触发。关于做什么不同的任何想法或建议?

2 个答案:

答案 0 :(得分:0)

这有点像黑客,但它确实有效。

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

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

FWIW,即使在这种覆盖功能中,我仍然无法将回调变为“未定义”以外的任何内容。

答案 1 :(得分:0)

管理以实现这一目标:

// 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); });
});

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