2013-01-07 40 views
3

我有一个复杂的knockout.js对象,它实际上是一个observableArray,里面还有另一个observableArray。我有一个删除功能,它异步地从第二个数组中删除选定的元素。一个项目正在数据库中存档,而客户端的一个可观察属性被设置为false,使其从屏幕上消失。knockout.js指向父对象

使用$根关键字创建一个删除按钮事件:

<a href="#" data-bind="click: $root.RemoveActivity">Remove</a> 

是什么给了我访问使用“this”关键字的选择元素的细节。我的问题是,当从第二个数组中删除项目时,我想将某些内容更改为其第一个数组中的父项目。正如我所提到的,“这个”关键字指的是子项目,有什么办法可以同时访问父项目吗?

+1

你可以尝试通过'$ parent'作为参数:'数据绑定=“点击:功能(数据,事件){回报$ root.RemoveActivity(data,event,$ parent);}“'那么你将得到thrid参数中的父项。 – nemesv

+0

谢谢你的回答! – Bartosz

回答

7

mhu的答案是一个反模式,因为它会在ViewModel和View的结构之间创建一个依赖关系。

而是做

<a href="#" data-bind="click: $parent.removeActivity.bind($parent)">Remove</a> 

父视图模型

removeActivity: function(activity) { 
    this.activities.remove(activity); 
} 
+0

你说得对,这样好多了。没有意识到你可以用这种方式使用bind()。 – mhu

+0

谢谢,希望你不会因为反模式声明而感到愤怒,但是在一个更复杂的大型网站中,你可能会因为与视图的硬耦合而陷入困境,也难以测试等。 – Anders

+0

您是否也可以指定反模式是什么?我正在考虑使用可选参数将子模型的构造函数链接到其父项,以便该模型可以包含一个用于删除自身的操作。这是你所说的反模式,还是mhu说了别的什么? –