2012-03-20 1 views
6

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

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

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

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

ответ

14

Вот пример, который показывает настройки, как ваш массив создание и определение ключа для него, так что вы можете применить обновления с помощью отображения плагина: 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); 
+0

Итак, в этом примере вы говорите, что ключ - это все данные? Я думал, что вам нужно пройти в какой-то «предмет», чтобы сделать это. Это действительно впечатляющий материал, я не представлял, как это выглядит. Им нужен такой пример на сайте, или вы должны добавить его в KnockMeOut :). – farina

+0

Может быть, ключ становится data.id? При отладке моего решения похоже, что это может быть так. – farina

+0

В этом случае функция 'key' возвращает' data.id'. Это помогает? –