Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax durandal:在ViewModels之间传递数据的最佳方式_Ajax_Visual Studio 2012_Durandal_Hottowel - Fatal编程技术网

Ajax durandal:在ViewModels之间传递数据的最佳方式

Ajax durandal:在ViewModels之间传递数据的最佳方式,ajax,visual-studio-2012,durandal,hottowel,Ajax,Visual Studio 2012,Durandal,Hottowel,Durandal:如果可能(不处理后端),在Viewmodels之间传递数据(参数)的正确方法是什么 假设我有两个视图,概述和详细信息我希望用户从概述点击列表元素,它获取该元素的id并将其传递给详细信息视图模型,以便我可以开始使用该id 谢谢您的帮助提示:您可能需要路由驱动方法。另一个是为了完整性 视图模型驱动方法 一般来说,我会说:创建一个模块,我们称之为数据,并将数据模块注入两个viewmodels中。Overview然后可以在数据模块上设置clickedElementId属性,detail

Durandal:如果可能(不处理后端),在Viewmodels之间传递数据(参数)的正确方法是什么

假设我有两个视图,概述详细信息我希望用户从概述点击列表元素,它获取该元素的id并将其传递给详细信息视图模型,以便我可以开始使用该id


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

视图模型驱动方法 一般来说,我会说:创建一个模块,我们称之为数据,并将数据模块注入两个viewmodels中。Overview然后可以在数据模块上设置clickedElementId属性,details可以读取属性的值并使用它(您甚至可以使属性可见,以便在Overview更改属性时通知details)。当两个视图模型可以同时处于活动状态时,此方法有效,而我的下一个(首选)解决方案仅在从一个视图路由到另一个视图时有效,因此它们永远不会同时处于活动状态。这种“viewmodel驱动”的方法是我个人用于应用程序中常见数据的方法(您也可以将应用程序外壳viewmodel用于这些类型的属性)

路线驱动进近 根据你对情况的描述,这似乎是你想要做的。定义的管线可以采用(可选)参数。假设您现在有路由“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);
}
dataFor是一个很好的敲除帮助器,用于获取绑定到传递给它的元素(在本例中是list元素)的viewmodel数据。单击时,您希望导航到详细信息,并将所单击元素的id传递给详细信息。上面的代码完成了所有这些

现在,您的details viewmodel的激活功能应该如下所示:

details.activate = function (id) {
    // id is the parameter we defined for the route. Now you are free to leverage it inside your second view!
};
<div data-bind="foreach: myListOfElements">
    <a href="#" data-bind="attr: { href: '#details/' + id }">listElementGoesHere</a>
</div>
编辑:附加提示:您还可以直接从链接触发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!
};
<div data-bind="foreach: myListOfElements">
    <a href="#" data-bind="attr: { href: '#details/' + id }">listElementGoesHere</a>
</div>


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

看起来不错,我会尝试一下,并让你知道。不,我现在还没有完整的示例。有什么特别需要我详细解释的吗?由于Durandal的设置代码,在JSFIDLE上创建一个完整的示例是很困难的,但是我可以为views/viewmodels创建一个更完整的HTML和JS。嗨,我刚才看到了你的评论,看到你现在删除了它。我还是很乐意举个例子,如果你还想要的话就告诉我吧!