根据我的说法,ko.compose 不是那么动态的,并且似乎像 Razor 的布局一样工作。
使用 durandal,最好尽可能地制作单独的视图,然后将它们链接到路由器。我正在使用 John Papa 的热毛巾模板;
我的建议涉及通过 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
}
注意: 在使用此解决方法之前,您必须考虑安全问题,由于我是 durandal 新手,我不知道这是否不会对路由器的路由生命周期造成严重后果。还要注意对象的名称,因为它在路由器的路由生存期间永久保留。