两次绑定到相同的数据在淘汰赛中第二次不起作用

时间:2013-02-06 13:58:40

标签: knockout.js jqxgrid jqxwidgets

我提交您的考虑,这个小提琴:http://jsfiddle.net/alexdresko/HFFUL/5/

HTML中有两个相同的网格,但单击“加载”按钮时只会填充其中一个网格。

这是由于我自己对淘汰赛的基本误解,还是因为它是一个jqxgrid问题?

以下是代码:

<a href="#" data-bind="click: load">Load</a>

<div class="aGrid" data-bind="jqxGrid: { source: Stuff().People, columns: [ {text: 'Name', datafield: 'Name'} ], autoheight: true, sortable: true, altrows: true, enabletooltips:true }"></div>
<div class="aGrid" data-bind="jqxGrid: { source: Stuff().People, columns: [ {text: 'Name', datafield: 'Name'} ], autoheight: true, sortable: true, altrows: true, enabletooltips:true }"></div>

var dataFromServer = {
    People: ko.observableArray([{
        Name: "George"
    }, {
        Name: "Scot"
    }])
};

var viewModel = function () {

    this.Stuff = ko.observable({});
    this.load = function () {
        this.Stuff(dataFromServer);

    };
};

$(function () {
    var vm = new viewModel();
    ko.applyBindings(vm);
});

2 个答案:

答案 0 :(得分:2)

问题出现在source : Stuff().People中,因为您在此处显式获取了Stuff observable的并访问了该属性的People属性。更改Stuff本身不会更改绑定的可观察数组。

但是,总的来说还有一个更加精巧的解决方案,你也不需要让dataFromServer成为一个可观察的:

<强> HTML:

<a href="#" data-bind="click: load">Load</a>

<div class="aGrid" data-bind="jqxGrid: { source: Stuff.People, columns: [ {text: 'Name', datafield: 'Name'} ], autoheight: true, sortable: true, altrows: true, enabletooltips:true }"></div>
<div class="aGrid" data-bind="jqxGrid: { source: Stuff.People, columns: [ {text: 'Name', datafield: 'Name'} ], autoheight: true, sortable: true, altrows: true, enabletooltips:true }"></div>

<强> JavaScript的:

var dataFromServer = [{
        Name: "George"
    }, {
        Name: "Scot"
    }];

var viewModel = function () {

    this.Stuff = { People: ko.observableArray([]) }
    this.load = function () {
        for (i=0; i < dataFromServer.length; ++i) {
            this.Stuff.People.push(dataFromServer[i]);
        }

    };
};


$(function () {

    var vm = new viewModel();
    ko.applyBindings(vm);

});

Forked JSFiddle

答案 1 :(得分:0)

不确定原因,但当我将这两个网格包裹在这样的div中时:

<div data-bind="if: Stuff().People">

工作得很好。当然,这会完全隐藏你的网格,直到你点击加载。

Fiddle