上下文
我正在探索KnockoutJS,结合KoGrid
我有一个对象包含几个字段(它们也绑定到字段),以及一个子对象列表,我想在KoGrid中显示。
的jsfiddle
我准备了一个jsFiddle来说明我遇到的问题:
http://jsfiddle.net/kPmAJ/4/
问题:
我的viewmodel包含 observable foo ,其中包含父对象。
在此父对象中,有一个属性 children ,它是一个 observableArray ,它再次包含对象。
KoGrid必须$root.foo().children
如果在初始化绑定之前填充数组,则此方法有效 但是,之后对象被替换(数据通过AJAX加载并且可以重新加载),显然 KoGrid项目绑定丢失。
我在想,因为我的viewmodel上的 foo 对象是一个 observable ,如果foo被替换,这将触发正在观看内部数组的KoGrid 。这确实与foreach-binding完美配合。
显然KoGrid不会触发。
-
我在这里做错了什么,还是我在KoGrid遇到了问题?
代码(供参考。参见fiddler;))
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>
谢谢!
答案 0 :(得分:2)
发生的事情是koGrid绑定没有更新处理程序,所以它没有响应bar中的任何更改。
koGrid确实会监视可观察数组子节点,如果你要替换bar()中的值,那么从Ajax调用返回的子节点将会更新网格。
像这样:
function (data) {
var childrenMapped = [];
$(data.children).each(
function() {
childrenMapped.push(new SampleChildObject(this));
});
bar().children(childrenMapped);
bar().id(data.id);
});
您还应该检查应该解决此问题的映射插件。 ko mapping