добавяне на множество елементи към Slick grid с нокаут observableArray

Използвам нокаут персонализиран bindingHandler за свързване на данни към slickgrid въз основа на пример от rniemeyer, когато кодът се изпълнява, ако щракнете върху връзката „добавяне“, тогава към мрежата се добавя ред с помощта на myObservableArray.push(newRow), но когато опитайте да замените всички данни в мрежата чрез връзката „замяна“, мрежата не се актуализира и бутонът за добавяне спира да работи. Опитвам се да актуализирам наблюдавания масив, като извикам myObservableArray(multipleRows) това ли е правилният начин да го направя?

Примерът: 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
    }, 
}

person Dave    schedule 05.06.2013    source източник


Отговори (3)


Пропуснахте SetData в актуализацията на нокаутното персонализирано свързване. grid.setData(данни,вярно);

ето как ще изглежда:

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/

person Joybroto    schedule 06.06.2013

Не използвам Knockout, но бих си представил, че трябва да изглежда така:

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

Knockout и SlickGrid използват основен масив от данни, за да изпълняват работата си. Всичко, което трябва да направите, е да ги поддържате да използват същия масив. от

this.items(newList); 

правите Knockout да използва друг масив. Добър вариант тук е да помолите SlickGrid да направи същото:

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

тук е http://jsfiddle.net/bwSmy/6/, за да видите други опции

person Rustam    schedule 06.06.2013