Мы рефакторим наш клиентский код и реализуем модели представления. Я хотел бы, чтобы наши модели представления были как можно более тупыми, чтобы они были исключительно представлениями данных.
Мы будем использовать контроллер представления и публикацию/подписку, чтобы получать свежие данные для виртуальной машины по мере необходимости, и просто помещать данные в модель представления в модели односторонней иерархии данных, похожей на то, как компоненты взаимодействуют в Vue.
Для плоских свойств модели просмотра этот подход отлично работает, используя функцию «Props», но в случае вложенных наблюдаемых, таких как адрес, я теряю наблюдаемые (конечно).
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, но это требует немного большего интеллекта в моей функции Props, где я бы сделал что-то вроде
if(self['mapping_' + p]){
//If self.mapping_address() exists, use that to
//create mapped observables...
}else if(self[p]){}...
Мне было бы удобно с этим, но это кажется немного неуклюжим. Есть ли лучший способ поддерживать вложенные наблюдаемые объекты при передаче иерархических данных из службы или контроллера?