我正在使用KnockoutJS,我想知道一個方法,其中observableArray中的可觀察對象可以通知父變更。這裏有一個例子:如何通知父母的變化
http://jsfiddle.net/paragnair/CEEZ5/
HTML:
<h1 id="heading"> <text data-bind="text:childrenCount"></text> Fields selected</h1>
<table id="form">
<tbody data-bind="foreach:children">
<tr>
<td data-bind="text:name"></td>
<td><input type="checkbox" data-bind="checked:isSelected"/></td>
</tr>
</tbody>
</table>
<a href="#" id="btn-add">Add More Fields</a>
的Javascript:
var Child = function(name) {
var self = this;
self.name = ko.observable(name);
self.isSelected = ko.observable(false);
},
Parent = function() {
var self = this;
self.children = ko.observableArray([
new Child('One'),
new Child('Two'),
new Child('Three')
]);
self.children.subscribe(function(children) {
header.childrenCount($.map(children, function(a) {
return a.isSelected() ? 1 : null;
}).length);
});
},
header = {
childrenCount: ko.observable(0)
};
var parentModel = new Parent(),
extra = parentModel.children().length;
ko.applyBindings(parentModel, $('#form')[0]);
ko.applyBindings(header, $('#heading')[0]);
function setHeading(childrenCount) {
header.childrenCount(childrenCount);
}
$(document).ready(function() {
$('#btn-add').click(function() {
extra++;
parentModel.children.push(new Child('Extra ' + extra));
return false;
});
});
在上面的例子中,我要顯示與選定字段數標題。我有一個subscribe
事件observableArray
,但只有當數組被添加或刪除時觸發,所以當用戶實際檢查字段列表中的複選框時,事件不會被觸發。實現此目的的一種方法是在複選框上添加onchange事件以調用父級方法,該方法inturn調用某個外部方法,該方法更新header
對象上的childrenCount
。有沒有更好的方法來做到這一點?
不幸的是,事情是在我的應用程序設計的方式,我必須保持applyBindings分開。所以我需要一種方法來調用一個外部函數,只要一個數組中的一個觀察對象的值被更新。而對於按鈕上的點擊處理程序,這只是一個例子,這不是我的實際項目。 – Wiz