【发布时间】:2014-10-15 02:58:09
【问题描述】:
我正在为VS2013 SPA MVC-5 模板中的导航而苦苦挣扎。我做了 2 个假设(因为我找不到好的参考资料),但似乎我错了,或者只是效果不佳:
以为导航是基于典型的
spa # url encoding,比如直接导航到users account management page应该可以使用:http://localhost:18759/#/manage我还认为,在浏览网站(单页)时,我认为这些
# url's由默认的knockout.js文件构成,这些文件包含在模板中。结合前面的假设,这将导致适当的历史积累。
http://localhost:18759/#/manage 似乎没有导航到manage 页面(其他# url's 也不起作用)。
我注意到一些框架可以处理这个问题(navrouter 和sammy.js),但据我所知,实现它们需要相当多的努力,特别是如果它已经在模板中就位。
至于我做出这些假设的原因,有一篇文章here,暗示这是因为这部分:
// app.viewmodel.js - there is a method called "addViewModel()
if (typeof (options.navigatorFactory) !== "undefined") {
navigator = options.navigatorFactory(self, dataModel);
} else {
//suggests "#"-hash navigation
navigator = function () {
window.location.hash = options.bindingMemberName;
};
}
但在我自己的app.viewmodel.js 中,这些行根本没有参考哈希:
if (typeof (options.navigatorFactory) !== "undefined") {
navigator = options.navigatorFactory(self, dataModel);
} else {
navigator = function () {
self.errors.removeAll();
self.view(viewItem);
};
}
app.viewmodel.js 这里有对哈希的引用,但这似乎无法处理导航:
// Private operations
function cleanUpLocation() {
window.location.hash = "";
if (typeof (history.pushState) !== "undefined") {
history.pushState("", document.title, location.pathname);
}
}
function getFragment() {
if (window.location.hash.indexOf("#") === 0) {
return parseQueryString(window.location.hash.substr(1));
} else {
return {};
}
}
我的导航代码如下所示:
<ul class="nav navbar-nav navbar-right">
<li data-bind="with: user"><a href="#" data-bind="click: manage">manage</a></li>
</ul>
导航工厂非常默认,例如:
app.addViewModel({
name: "Manage",
bindingMemberName: "manage",
factory: ManageViewModel,
navigatorFactory: function (app) {
return function (externalAccessToken, externalError) {
app.errors.removeAll();
app.view(app.Views.Manage);
if (typeof (externalAccessToken) !== "undefined" ||
typeof (externalError) !== "undefined") {
app.manage().addExternalLogin(externalAccessToken, externalError);
} else {
app.manage().load();
};
}
}
});
问题
- 这应该有效吗?如果是这样,我该如何解决?
- 或者我需要像
sammy.js或navrouter这样的额外组件吗?
【问题讨论】:
-
我不知道 Knockout 内置了任何路由。我目前正在使用github.com/finnsson/pagerjs,这是一种设计用于与 Knockout 一起使用的路由解决方案。它并不完美,但做得很好。
标签: knockout.js visual-studio-2013 asp.net-mvc-5 single-page-application