コンテキスト
私は現在、KoGrid と組み合わせた KnockoutJS を調査しています。
複数のフィールド(フィールドにもバインドされている) を含むオブジェクトと、KoGrid に表示したい子オブジェクトのリストがあります。
私が抱えている問題を示す jsFiddle を用意しました:
http://jsfiddle.net/kPmAJ/4/
問題:
私のビューモデルには、親オブジェクトを含む監視可能な fooが含まれています。
この親オブジェクトには、オブジェクトを含むobservableArrayであるchildrenプロパティがあります。
KoGrid はバインドされています$root.foo().children
これは、バインディングを初期化する前に配列が満たされている場合に機能します。
ただし、オブジェクトは後で置き換えられ (データは AJAX を介してロードされ、再ロードできます)、明らかにKoGrid アイテムのバインドが失われます。
ビューモデルの foo オブジェクトは observable であるため、これにより、内部の配列を監視している KoGrid がトリガーされ、 foo が置き換えられた場合に更新されると考えていました。これは foreach バインディングで完全に機能します。
どうやらKoGridはトリガーしません。
--
ここで何か間違ったことをしていますか、それとも KoGrid で問題が発生していますか?
コード (参考用です。フィドラーを参照してください ;))
var SampleObject = function (data) {
this.id = new ko.observable(data ? data.id : null);
this.children = new ko.observableArray([]);
if(data) {
var childrenMapped = [];
$(data.children).each(
function() {
childrenMapped.push(new SampleChildObject(this));
}
);
this.children(childrenMapped);
}
}
var SampleChildObject = function (data) {
this.name = new ko.observable(data ? data.name : null);
};
var vm = {
foo: new ko.observable('John Doe'),
bar: new ko.observable(
new SampleObject(
{
id: 1234,
children: []
})
)
};
ko.applyBindings(vm);
// Returns from an AJAX-call instead, so can't be before applyBindings
vm.bar(new SampleObject(
{
id: 1234,
children: [
{ name: 'test1' },
{ name: 'test2' },
{ name: 'test3' }]
}));
-
<div style="height: 500px;"
data-bind="koGrid: { data: bar().children }"></div>
<ul data-bind="foreach: bar().children">
<li data-bind="text: name"></li>
</ul>
ありがとう!