Нокаут и наблюдаемые массивы с использованием плагина сопоставления

приведенный ниже код работает нормально, когда я вызываю его в первый раз, однако во втором вызове gridviewmodel становится беспорядочным, и все данные становятся избыточными

$.ajax({
        url: 'rest service uri',
        type: 'GET',
        data: parameters,
        dataType: 'json',
        crossDomain: true,

        success: function (data) {

            function gridviewModel() {
                var self = this;
                self.items = ko.mapping.fromJS(data);
                self.columns = [
                    new column("Name", "name", "Asc"),
                    new column("URL", "name", "Asc"),
                    new column("Embargo Date", "name", "Asc"),
                    new column("Status", "name", "Asc"),
                    new column("Reviewer Name", "name", "Asc"),
                    new column("Approver Name", "name", "Asc")
                ];
            };


            ko.applyBindings(new gridviewModel());
}

Я попытался очистить наблюдаемый массив с помощью removeAll (), но у меня это не сработало.

Любая идея?

Просто для любого, кто может столкнуться с этой проблемой в будущем, мне удалось исправить ее, вызвав ko.mapping.fromJS (data, gridviewModel.items) в плагине сопоставления Knockout. Полный код

var gridviewModel = {

        items: ko.mapping.fromJS([]),
        columns: [
                    new column("Name", "name", "Asc"),
                    new column("URL", "name", "Asc"),
                    new column("Embargo Date", "name", "Asc"),
                    new column("Status", "name", "Asc"),
                    new column("Reviewer Name", "name", "Asc"),
                    new column("Approver Name", "name", "Asc")
                ]
};

$(function () {
    ko.applyBindings(gridviewModel, document.getElementById("wip"));

});

Надеюсь, это решит другие проблемы.


person Hazem Salem    schedule 23.09.2013    source источник


Ответы (1)


После прочтения документации по подключаемому модулю сопоставления нокаутов кажется, что сопоставленный объект data должен быть вашим viewmode, а не свойством в вашем viewmodel. На вашем месте я бы изменил свой код, чтобы использовать следующее:

          function gridviewModel() {
                var self = this;
                self.items = data;
                self.columns = [
                    new column("Name", "name", "Asc"),
                    new column("URL", "name", "Asc"),
                    new column("Embargo Date", "name", "Asc"),
                    new column("Status", "name", "Asc"),
                    new column("Reviewer Name", "name", "Asc"),
                    new column("Approver Name", "name", "Asc")
                ];
            };


            ko.applyBindings(ko.mapping.fromJS(new gridviewModel()));

Это отобразит весь ваш объект, как указано в документации.

person bluetoft    schedule 23.09.2013
comment
Большое спасибо за ваши комментарии, мне не хватало вызова метода updateFromJS (). 'код' ko.mapping.fromJS (данные, gridviewModel.items); - person Hazem Salem; 23.09.2013
comment
рад, что вы нашли проблему! Вы познакомили меня с классным плагином! Я воспользуюсь им утром. Спасибо. - person bluetoft; 23.09.2013
comment
много других хороших подсказок по плагину сопоставления, если вы ищете нокаут-сопоставление в стеке - person beauXjames; 23.09.2013
comment
Спасибо за ваше предложение. - person Hazem Salem; 24.09.2013