2012-12-27 65 views
4

比方說,我有一個Knockout.js:在數據綁定事件訪問父集合

<button type="button" data-bind="click: actions.remove">×</button> 

和處理

var actions = { 
    remove: function(item) { 
     ?array?.remove(item); // ?array? is a containing array, accessed somehow 
    } 
} 

如何找到?array?這樣我就可以使用相同的button在任何foreach綁定?

澄清:
我知道該怎麼做,如果我把remove到視圖模型。然而,視圖模型包含分層數組,我並不想完全通過它來獲取正確位置的方法。在ko.mapping的幫助下,偶爾也會從服務器更新視圖模型,但這不會爲新數據添加任何方法。這就是爲什麼我分開實施處理程序。

回答

3

你嘗試這樣的事情。

<div data-bind="foreach: someArray"> 
    <button type="button" data-bind="click: $parent.actions.remove">x</button> 
</div> 


//Inside your viewmodel. 
var self = this; 
self.someArray = ko.observableArray(); 
self.actions = { 
remove: function() { 
    self.someArray.remove(this); // ?array? is a containing array, accessed somehow 
} 
} 

編輯:對不起,我誤解了你的意思。你可以嘗試這樣的事情,使其適用於任何綁定。

<div data-bind="foreach: someArray"> 
    <button type="button" data-bind="click: function() {$parent.actions.remove($parent.someArray(), $data}">x</button> 
</div> 


//Inside your viewmodel. 
var self = this; 
self.someArray = ko.observableArray(); 
self.actions = { 
remove: function(arr, item) { 
    arr.remove(item); // ?array? is a containing array, accessed somehow 
} 
} 
+0

謝謝,我知道我可以做到這一點,但數組是分層的,所有這一切都將很快變得有用,這就是爲什麼我將處理程序分開的原因。更新了問題。 –

+0

如果您不想在每個視圖模型中刪除方法,則可以將其存儲在根視圖模型中,並使用$ root而不是$父項。或者你甚至可以插入一個匿名函數綁定到點擊綁定。嘗試這樣的,點擊:function(){$ parent.someArray()。remove($ data)。 –