2014-01-09 51 views
4

Durandal:如果可能的话(在不处理后端的情况下)在Viewmodels之间传递数据(参数)的正确方法是什么。durandal:在ViewModels之间传递数据的最佳方式

让说,我有2次概述细节我想,去了一个列表元素的用户克利克从概述需要该元素的ID,并把它传递给细节视图模型,使我可以开始使用该ID。

感谢您的帮助

回答

8

提示:您可能需要路线驱动的方法。另一个是为了完整性。

视图模型驱动的方法 一般来说,我会说:创建一个模块,我们称之为数据,并在这两个的ViewModels注入数据模块。然后,Overview可以在数据模块上设置clickedElementId属性,并且细节可以读取属性的值并使用它(甚至可以使属性成为可观察的,从而在属性被概览更改时通知细节)。如果两个视图模型可以同时处于活动状态,则此方法适用,而我的下一个(首选)解决方案仅适用于从一个视图到另一个视图的路由,因此它们不会同时处于活动状态。这种“视图模型驱动”方法是我个人用于应用程序中常见数据的方法(您也可以使用应用程序外壳视图模型来处理这些类型的属性)。

路线驱动的方法 似乎是你想要做什么给你的情况描述。定义的路线可以采用(可选)参数。假设你现在有路由'details',你可以将它改为'details /:id'(接受一个id参数,非可选)或'details(/:id)'(接受一个id参数,可选)。

您需要一个事件处理程序有点像这样的点击列表元素:

overview.onElementClick = function (e) { 
    var element = this, // The idea is that you need the clicked element for the next line of code 
     koDataForElement = ko.dataFor(element); 

    router.navigate('details/' + koDataForElement.id); 
} 

ko.dataFor是一个很好的淘汰赛助手获得绑定到你进入它的元素视图模型数据,在这种情况下你的列表元素。点击后,您要导航到详细信息,并将点击元素的ID传递给细节。上面的代码完成了这一切。

现在您的详细信息视图模型的激活功能应该是这样的:

details.activate = function (id) { 
    // id is the parameter we defined for the route. Now you are free to leverage it inside your second view! 
}; 

编辑:额外提示:您还可以直接从一个链接触发与ID的路由。假设你的整个列表元素被包裹在一个锚标签中,你可以做这样的事情:

<div data-bind="foreach: myListOfElements"> 
    <a href="#" data-bind="attr: { href: '#details/' + id }">listElementGoesHere</a> 
</div> 

祝你好运!如果还不清楚,请告诉我,

+0

看起来不错我给它试试,让你知道吧 –

+0

不,我没有一个完整的例子在准备。特别是你需要我解释一些更精细的部分?由于Durandal设置代码,JsFiddle上的完整示例很难实现,但我可以为views/viewmodels放置更完整的HTML和JS。 –

+0

嗨,我刚刚看到你的评论,并看到你现在删除它。我仍然乐于举个例子,让我知道你是否还想要它! –

相关问题