我正在使用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函数在交换内容之前触发。关于做什么不同的任何想法或建议?
答案 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); });
});
我设法通过将回调参数包装在另一个函数中来使回调参数不被“未定义”。