Durandal多主页

时间:2013-05-08 02:04:17

标签: knockout.js single-page-application durandal sammy.js

我正在开发一个SPA,我想使用多个主视图。这是我的用例:

我有一个拥有个人资料页面的用户。在该个人资料页面中,我希望能够显示几个不同的视图,即。细节,作品,联系信息等。我需要能够深入链接到每个视图。每个视图都必须显示主布局视图中的基本用户数据。

我的理解是我应该使用compose这个并且我有一些似乎有效的代码,但是,我希望能够将数据从“辅助shell”传递到实际的子视图。似乎splat数据不会传递给子视图模型的activate方法。

在我的“master”viewmodel中,我创建了一个名为activeView的observable,它包含一个对应于子视图模型的字符串(viewmodels / user / details)。然后我有一个敲门声明如下:

<!-- ko compose: {
    model: activeView(),        
    activate: true
} --><!-- /ko -->

如何将数据传递到子视图?或者有更好的方法吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

据我说,ko.compose不是那么有活力,似乎像Razor的布局一样。 使用durandal,最好能够单独制作视图,然后将它们链接到路由器。我正在使用John Papa的Hot-Towel模板; 我的建议涉及通过durandal路由器和淘汰赛传递数据(超过id)。

初始化您的应用时(shell.js,main.js,...) 使用最终过滤设置将您的路线映射到某处(shell.js或main.js)。 对于将传输数据的路由,使用(:id)提议构建它们

router.mapRoute('view/:id', moduleId, 'Customer Details', false);

需要某些路线的地点和时间 您可以查看Joseph Gabriel的解决方案(https://stackoverflow.com/a/16036439/2198331)来过滤您的路线,以便在需要时随时随地使用。过滤路径后,您可以破解 routeInfo 来传输参数(字符串或像selectedItem这样的对象)。

arearoutes = ko.utils.arrayFilter(router.visibleRoutes(), function (route) {
              // mgpe has been set at app init
                return route.settings.mgpe === 112; 
             });

使用您要传输的数据从过滤器的结果中扩展您的routeInfo

areaRoutes.forEach(function(ar){
     ar.myItem = mydata; // or vm.selectedItem(); DEPARTURE LUGGAGE
}, areaRoutes);

您的(myItem)现已根据需要添加到这些路线 除非您更新了路由器的相同对象( myItem

,否则这些或这些路径将随身携带您的数据并且永远不会丢失它们
function activate(adata){
       vm.arrivalData(adata.routeInfo.myItem);  // ARRIVAL LUGGAGE are here
}

路线可以携带嵌套路线 对于嵌套上下文(如嵌套菜单)很有用;您可以通过在父路线处于活动状态时准备旅行来玩儿童路线:

router.activeItem.settings.areSameItem = function (currentItem, newItem, activationData) {
   mybag = activationData.routeInfo; // TRAVEL (current) LUGGAGE are present here
}

<强> N.B。 :在使用此解决方法之前,您必须考虑安全问题,因为我是durandal的新手,我不知道这是否会给路由器的路由生命周期带来严重后果。还要注意对象的名称是在路由器路由生存期间永久停留的。

答案 1 :(得分:0)

如何创建用户对象并在每个视图模型中需要它?最简单的方法是将其附加到应用程序(即app.user =)对所述用户对象中的任何可观察对象所做的更改将更新到SPA中的每个视图和视图模型。

这样你就可以利用淘汰图书库的子/ pub

的功能