Мы проводим рефакторинг нашего клиентского кода и внедряем модели представления. Я бы хотел, чтобы наши view-модели были настолько тупыми, насколько это возможно, чтобы они были исключительно представлениями данных.
Мы будем использовать контроллер представления и pub / sub для получения свежих данных для vm по мере необходимости, и просто поместим данные в viewmodel в модели односторонней иерархии данных, схожей с тем, как компоненты взаимодействуют в Vue.
Для плоских свойств viewmodel этот подход прекрасно работает, используя функцию 'Props', но для случая вложенных наблюдаемых, таких как address, я теряю наблюдаемую (конечно).
var model = function() {
var self = this;
self.name = ko.observable();
self.occupation= ko.observable();
self.address = ko.observable({
street: ko.observable('Streetname'),
zip: ko.observable('Zipcode')
});
self.doUpdate = function() {
self.props({name: 'Tom', address: {street:'NewStreet'}});
};
self.props = function(data) {
var viewmodel = self;
for (p in data) {
if (self[p]) {
self[p](data[p]);
}
}
};
}
ko.applyBindings(new model());
Я не могу пройти
self.props({name: 'Tom', address: {street:ko.observable('NewStreet')}});
потому что я должен предположить, что мы просто получим структуру данных из службы или другого модуля, и задачей модели представления является управление наблюдаемыми или нет.
Альтернативой, о которой я думал, было просто использовать функциональность ko mapping, но для этого требовалось немного больше интеллекта в моей функции Props, где я делал бы что-то вроде
if(self['mapping_' + p]){
//If self.mapping_address() exists, use that to
//create mapped observables...
}else if(self[p]){}...
Мне было бы удобно с этим, но это кажется немного грязным. Есть ли лучший способ обеспечить поддержание вложенных наблюдаемых при передаче иерархических данных из службы или контроллера?