ko.mapping создать функцию, расширить объект

Можно ли изменить (из-за отсутствия лучшего термина) схему объекта в процессе сопоставления? Я бы предположил, что это так, я просто не могу заставить его работать. Я пытаюсь что-то вроде этого:

var data = {
    itemOne: 'someData',
    itemTwo: 'moreData'
}

var mapping = {
    "newItem": {
          create: function(options) {
            return ko.observable(false);
          }
    }
};

ko.mapping.fromJS(data, mapping, _model.observableArrayPart);

person farina    schedule 20.03.2012    source источник


Ответы (1)


Вот пример, показывающий настройку создания вашего массива и определение для него ключа, чтобы вы могли применять обновления с помощью подключаемого модуля сопоставления: http://jsfiddle.net/rniemeyer/LHeQZ/

var data = [
    { id: 1, first: "Bob", last: "Smith" },
    { id: 2, first: "Jim", last: "Jones" },
    { id: 3, first: "Delete", last: "Me" }
];

var updatedData = [
    { id: 1, first: "Robert", last: "Smith" },
    { id: 2, first: "James", last: "Jones" },
    { id: 4, first: "New", last: "Guy" }
];

var Person = function(data) {
    this.id = data.id;
    this.first = ko.observable(data.first);
    this.last = ko.observable(data.last);
    this.full = ko.computed(function() {
        return this.first() + " " + this.last();
    }, this);        
};


var dataMappingOptions = {
    key: function(data) {
        return data.id;        
    },
    create: function(options) {
        return new Person(options.data);
    }        
};


var viewModel = {
    people: ko.mapping.fromJS([]),
    loadInitialData: function() {
        ko.mapping.fromJS(data, dataMappingOptions, viewModel.people);        
    },
    loadUpdatedData: function() {
        ko.mapping.fromJS(updatedData, dataMappingOptions, viewModel.people);  
    }        
};

ko.applyBindings(viewModel);
person RP Niemeyer    schedule 20.03.2012
comment
Итак, в этом примере вы говорите, что ключом являются все данные? Я думал, что вам нужно передать какой-то предмет, чтобы сделать это. Это действительно впечатляющий материал, я не представлял себе, что выкладываю его вот так. Им нужен такой пример на сайте, или вы должны добавить его в KnockMeOut :). - person farina; 20.03.2012
comment
Может ключ становится data.id? При отладке моего решения похоже, что это может иметь место. - person farina; 20.03.2012
comment
В этом случае функция key возвращает data.id. Это помогает? - person RP Niemeyer; 21.03.2012
comment
Итак, нокаут распознает ключ как функцию, которая определяет, является ли элемент data.id уникальным? - person farina; 21.03.2012
comment
плагин сопоставления позволяет вам передавать параметры сопоставления. Функции key и create являются частью этого. Обычно вы указываете функции key и create для некоторого свойства ваших данных, например items, но в этом случае мы просто настраиваем их на корневом уровне, потому что имеем дело непосредственно с массивом данных. - person RP Niemeyer; 21.03.2012
comment
ОК, я так понял. Действительно отличная помощь! Спасибо еще раз! Вы вытащили меня из 10 биндов только на этой неделе :). - person farina; 21.03.2012
comment
Спасибо за пример, мне очень помогло :) - person stormbreaker; 20.07.2012
comment
Итак, в этом случае, какой смысл использовать плагин для отображения? Вы все равно делаете все вручную, не так ли? - person Tom McKearney; 06.07.2013
comment
Можно ли использовать эту технику для добавления грязных флагов к отдельным свойствам с помощью таких библиотек, как Knockout.dirtyFlag? github.com/CodeSeven/KoLite/blob/master/knockout.dirtyFlag. js - person Mr. Young; 20.08.2013
comment
Я с @TomMcKearney. Я не понимаю, в чем выгода от плагина сопоставления, если вы создаете объект Person вручную.?? - person Brad Bamford; 12.11.2013
comment
@BradBamford - в этом случае плагин сопоставления по-прежнему обрабатывает обновления для вас. Я лично не использую плагин для карт, так что в остальном я с вами согласен. Мне нравится иметь больший контроль над тем, как все создается. - person RP Niemeyer; 12.11.2013
comment
У меня есть проблема, когда наблюдаемое в объекте Person, например, имеет расширение rateLimit. Когда сопоставление fromJS создает объект таким образом, rateLimit не работает. - person Ian; 31.05.2016
comment
Таким образом, кажется, что объект, созданный с помощью сопоставления fromJS, имеет проблему, когда есть расширенное вычисляемое свойство с rateLimit. RateLimit не работал. Мне удалось обойтись подпиской, а не использованием ко-вычисленного - person Ian; 31.05.2016