mco*_*ham 8 sammy.js knockout.js single-page-application durandal
我正在开发一个SPA,我想使用多个主视图.这是我的用例:
我有一个有个人资料页面的用户.在该个人资料页面中,我希望能够显示几个不同的视图,即.细节,作品,联系信息等.我需要能够深入链接到每个视图.这些视图中的每一个都必须显示主布局视图中的基本用户数据.
我的理解是我应该使用compose这个并且我有一些似乎有用的代码,但是,我希望能够将数据从"辅助shell"传递到实际的子视图.似乎splat数据不会传递给子视图模型的activate方法.
在我的"master"viewmodel中,我创建了一个名为activeView的observable,它包含一个对应于子视图模型的字符串(viewmodels/user/details).然后,我有一个敲门声明如下:
<!-- ko compose: {
model: activeView(),
activate: true
} --><!-- /ko -->
Run Code Online (Sandbox Code Playgroud)
如何将数据传递到子视图?或者有更好的方法吗?
提前致谢!
小智 1
据我所知,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);
Run Code Online (Sandbox Code Playgroud)
何时何地需要一些路线 您可以查看 Joseph Gabriel 的解决方案 ( /sf/answers/1122550761/ ) 来过滤您的路线,以便在您需要的地点和时间使用。过滤路由后,您可以破解routeInfo来传输您的参数(字符串或对象,如selectedItem)。
arearoutes = ko.utils.arrayFilter(router.visibleRoutes(), function (route) {
// mgpe has been set at app init
return route.settings.mgpe === 112;
});
Run Code Online (Sandbox Code Playgroud)
使用您想要传输的数据从过滤器结果扩展您的routeInfo
areaRoutes.forEach(function(ar){
ar.myItem = mydata; // or vm.selectedItem(); DEPARTURE LUGGAGE
}, areaRoutes);
Run Code Online (Sandbox Code Playgroud)
您的 (myItem) 现在已附加到这些路由,如您所愿。 这个或这些路由将携带您的数据,并且永远不会丢失它,除非您更新了路由器的相同对象 ( myItem )
function activate(adata){
vm.arrivalData(adata.routeInfo.myItem); // ARRIVAL LUGGAGE are here
}
Run Code Online (Sandbox Code Playgroud)
路由可以携带嵌套路由, 对于嵌套上下文(如嵌套菜单)很有用;当父路线处于活动状态时,您可以通过准备行程来玩子路线:
router.activeItem.settings.areSameItem = function (currentItem, newItem, activationData) {
mybag = activationData.routeInfo; // TRAVEL (current) LUGGAGE are present here
}
Run Code Online (Sandbox Code Playgroud)
注意:在使用这个解决方法之前,你必须考虑安全问题,因为我是 durandal 的新手,我不知道这是否会给路由器的路由生命周期带来严重后果。还要注意对象的名称,因为它在路由器的路由生存期间永久保留。
| 归档时间: |
|
| 查看次数: |
2762 次 |
| 最近记录: |