我正在开发一个SPA,我想使用多个主视图。这是我的用例:
我有一个拥有个人资料页面的用户。在该个人资料页面中,我希望能够显示几个不同的视图,即。细节,作品,联系信息等。我需要能够深入链接到每个视图。每个视图都必须显示主布局视图中的基本用户数据。
我的理解是我应该使用compose这个并且我有一些似乎有效的代码,但是,我希望能够将数据从“辅助shell”传递到实际的子视图。似乎splat数据不会传递给子视图模型的activate方法。
在我的“master”viewmodel中,我创建了一个名为activeView的observable,它包含一个对应于子视图模型的字符串(viewmodels / user / details)。然后我有一个敲门声明如下:
<!-- ko compose: {
model: activeView(),
activate: true
} --><!-- /ko -->
如何将数据传递到子视图?或者有更好的方法吗?
提前致谢!
答案 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
的功能