2012-06-04 7 views
3

У меня есть сложная модель, которая содержит нагрузку ko.observable, ko.observableArray и вложенные объекты, которые содержат еще больше этих наблюдаемых.Частичное сопоставление существующего объекта с нокаутом JS

Теперь изначально мне приходилось делать методы внутри каждой из моделей, которые в составе составляют большую модель, чтобы принимать данные Json, а затем заполнять ее наблюдаемые. Теперь я попробовал ko.mapping плагин, но когда я использую, что делает:

ko.mapping.fromJS(jsonData, {}, existingModel); 

Который, кажется, работает для большинства объектов, однако я заметил, что когда я делаю это, кажется, полностью перезаписать объект, и как я я использую KNOCKOUT расслоение плотной проверки, а именно:

this.Name = ko.observable().extend({ required: true }); 
this.Age = ko.observable().extend({ required: true, digits: true }); 

Проблема заключается в том, что эти атрибуты проверки, кажется, должны быть удалены при использовании модуля отображения, так есть ли способ, чтобы получить отображение плагин просто обновить значения, а не подделка объектная схема ...

Я более чем счастлив использовать другой механизм, отличный от ko.mapping, если есть лучший способ применить данные Json к моделям.

ответ

2

Я закончил тем, что придерживаться с моим подходом, хотя мне удалось сократить большое количество кода, написанного для заполнения существующие поля, написав простой плагин ниже:

https://github.com/grofit/knockout.mapping.merge

это очень просто и на самом деле не делать многое другое, чем просто совпасть объекты с одинаковыми именами й существующие поля. Я надеялся управлять созданием дочерних объектов, чтобы он мог заполнить все дерево объектов, но, увы, у меня не хватило времени.

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

2

С http://knockoutjs.com/documentation/plugins-mapping.html (раздел Расширенное использование)

Иногда может возникнуть необходимость иметь больше контроля над тем, как выполняется отображение. Это выполняется с использованием параметров сопоставления. Они могут быть указаны во время вызова ko.mapping.fromJS. В последующих вызовах вам не нужно указывать их снова.

Так, например, вы можете попробовать что-то вроде этого:

var self = this; 
var mapping = { 
    update: function(arg) { 
     var data = arg.data; 

     return { 
      Name: data.Name && self.Name(data.Name), 
      Age: data.Age && self.Age(data.Age) 
     } 
    } 
}; 
ko.mapping.fromJS(data, mapping); 
+2

Да, я видел, что использование проблемы - это мои объекты. Структурное дерево огромно, и этот подход, вероятно, более подробен, чем мой текущий подход, когда каждый объект имеет метод стиля PopulationFromData (jsonData). Я надеялся полностью устранить эту проблему, поэтому я мог просто вызвать ko.mapping.fromJS (data, existingObject), и это не изменит структуру только значения ... возможно, я могу просто написать свою собственную на основе нокаута сопоставление исходного кода, чтобы сделать что-то вроде ko.mapping.updateValuesFromJS (данные, existingObject); – Grofit

0

Если ваши потребности скромны, вы можете сделать это с помощью простой петли для ванили JS. В этом примере предполагается, что существующая модель под названием «myViewModel», и данные для частичного обновления под названием «jsonData»:

for (var prop in jsonData) { 
    if (myViewModel.hasOwnProperty(prop)) { 
     myViewModel[prop](jsonData[prop]); 
    } 
} 

Как это только обновление значения, любые дополнительные атрибуты, вы прикреплены к наблюдаемым должны остаются на месте.

Смежные вопросы