【发布时间】:2014-03-12 03:29:44
【问题描述】:
我正在尝试将路由器配置为允许一个模型用于多个视图。
这是一个“配置文件”模块,所以我有一个像这样的顶级路由器:
.map([{ route: ['profile*details', ''], moduleId: 'myprofile', title: 'Your Profile', hash:'#profile', nav: false } ])
在 myprofile.js 模块中,我有子路由器:
define(['services/unitofwork', 'services/logger', 'durandal/system', 'durandal/activator', 'viewmodels/profile', 'plugins/router', 'durandal/app', 'services/errorhandler'],
function (unitofwork, logger, system, activator, Profile, router, app, errorhandler) {
var MyProfile = function () {
this.router = router.createChildRouter()
.makeRelative({
moduleId: 'my',
fromParent: true
}).map([
{ route: ['details'], moduleId: 'details', title: 'Details', type: 'intro', nav: true },
{ route: 'search', moduleId: 'jobsearch', title: 'Job Postings', type: 'intro', nav: true },
{ route: 'resume', moduleId: 'resume', title: 'Resume', type: 'intro', nav: true },
{ route: 'account', moduleId: 'account', title: 'Subscription', type: 'intro', nav: true }
]).buildNavigationModel();
}
return MyProfile;
});
我的理解是,如果我使用 splat 路由 (profile*details) 声明主模块,并且该模块在定义子内部路由的路由器属性上返回一个子路由器,那么我可以继续使用与每个内部视图组成的子模块。
基本上我想将 viewmodels/myprofile.js 模块与
views/my/details.html
views/my/resume.html
等等。
将工作单元与 Breeze 结合使用,此模式将使我能够在停用每个子视图时强制执行保存检查,但无需再次重新加载整个配置文件。
似乎 canReuseForRoute 属性可能有用,但我认为没有必要考虑到http://durandaljs.com/documentation/Using-The-Router.html - 模块重用--
考虑历史更改导致导航的场景 导致与已经处于活动状态并正在查看的模块相同。 通常,即使模块是相同的类型,它也会 丢弃并创建一个新实例。有两个例外 这个:
如果模块有与之关联的子路由器。该实例将 被保存。如果模块实现了特殊的回调,则调用 canReuseForRoute,这个函数将被调用允许开发者 确定是否应该丢弃该模块。
我错过了什么吗? 有没有可能做到这一点?
谢谢。
【问题讨论】:
-
不确定我是否理解您的问题。你想达到什么目的?
-
我希望整个“配置文件”视图模型存在于声明 childRouter 的同一视图模型中,并且该模型在导航部件时保持使用..
-
我最终进行了重构,将每个部分拆分为一个单独的视图模型。
标签: url-routing breeze durandal durandal-2.0