我们正在重构我们的客户端代码并实现视图模型。我希望我们的视图模型尽可能地保持愚蠢,让它们仅仅是数据表示。
我们将使用视图控制器和pub/sub来根据需要为vm获取新数据,并将数据以单向数据层次模型的形式推送到视图模型中,类似于Vue中组件的通信方式。
对于平面视图模型属性,这种方法可以很好地工作,使用一个'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')}});
因为我必须假设我们只是从服务或其他模块中获取数据结构,而视图模型的工作是管理什么是可观察的,什么不是。
我想到的另一种方法是使用koMap功能,但这需要在Props函数中增加一点智能,我将在其中执行以下操作
if(self['mapping_' + p]){
//If self.mapping_address() exists, use that to
//create mapped observables...
}else if(self[p]){}...
我对这种方法很满意,但它似乎有点笨拙。当从服务或控制器传递层次数据时,有没有更好的方法来维护嵌套的可观性?
1条答案
按热度按时间frebpwbc1#
我认为你有自己的 AJAX (get/post)实现 Package 在一个小库中,我们所做的是我们自己的xhrObject(jqXHR),它返回一个承诺,在我们解决该承诺的延迟之前,我们可以选择是否将属性更改为可观察的,以便视图模型实现不必处理转换每个API调用。
这是一个小东西,让你在你的方式,希望它帮助
第一个