KnockoutJSを使用していますが、observableArray内のobservableオブジェクトが親に変更を通知する方法を知りたいです。次に例を示します。
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
ますが、配列に何かが追加または削除された場合にのみ発生するため、ユーザーが実際にフィールドリストのチェックボックスをオンにしても、イベントは発生しません。これを実現する1つの方法は、チェックボックスにonchangeイベントを追加して、親のメソッドを呼び出し、次にオブジェクトのを更新する外部メソッドを呼び出すchildrenCount
ことheader
です。これを行うためのより良い方法はありますか?