使用knockout observableArray向Slick网格添加多个项目

时间:2013-06-05 22:33:33

标签: knockout.js slickgrid knockout-2.0 ko.observablearray

我正在使用敲除自定义bindingHandler根据rniemeyer的示例将数据绑定到slickgrid,当代码运行时,如果单击“添加”链接,则使用myObservableArray.push(newRow)将行添加到网格中,但是,当您尝试通过“替换”链接替换网格中的所有数据时,网格不会更新,并且添加按钮会停止工作。我试图通过调用myObservableArray(multipleRows)更新obsevable数组这是正确的做法吗?

示例: http://jsfiddle.net/davidoleary/bwSmy/

var viewModel = {
    items: ko.observableArray([]),
    addItem: function() {
        this.items.push(new Item(0, "New", 5.00));  // works
    },
    replace: function() {
        var newList = [new Item(0, "New", 6.00),new Item(0, "New", 7.00)]
        this.items(newList); // fails without throwing error
    }, 
}

3 个答案:

答案 0 :(得分:1)

您在淘汰赛自定义绑定的更新中错过了SetData。  grid.setData(数据,TRUE);

这就是它的样子:

ko.bindingHandlers.slickGrid = {
    init: function(element, valueAccessor) {
        var settings = valueAccessor();
        var data = ko.utils.unwrapObservable(settings.data);
        var columns = ko.utils.unwrapObservable(settings.columns);
        var options = ko.utils.unwrapObservable(settings.options) || {};
        grid = new Slick.Grid(element, data, columns, options);
    },
    update: function(element, valueAccessor, allBindingAccessor, viewModel) {
        var settings = valueAccessor();
        var data = ko.utils.unwrapObservable(settings.data); //just for subscription
        grid.resizeCanvas(); // NB Very important for when a scrollbar appears        
        grid.setData(data,true); // This is what was missing
        grid.render();
    }
}

更新小提琴: http://jsfiddle.net/joybroto/bwSmy/4/

答案 1 :(得分:0)

我不使用Knockout,但我想它需要看起来像这样:

var newList = [new Item(0, "New", 6.00),new Item(0, "New", 7.00)];
this.items(ko.observableArray(newList));

答案 2 :(得分:0)

Knockout和SlickGrid使用底层数据阵列来执行他们的工作。您需要做的就是让他们使用相同的数组。 通过

this.items(newList); 

你让Knockout使用其他数组。这里好的opton是要求SlickGrid做同样的事情:

grid.setData(newList, true);
grid.render();

这里有http://jsfiddle.net/bwSmy/6/来查看其他选项