KnockoutJS + KoGrid - 作为ko.observable(对象)的子节点的可观察数组不会触发更新

时间:2013-04-18 15:18:32

标签: javascript knockout.js kogrid

上下文
我正在探索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>

谢谢!

1 个答案:

答案 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