knockout.js 使用视图控制器敲除嵌套可观测量

j8ag8udp  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(141)

我们正在重构我们的客户端代码并实现视图模型。我希望我们的视图模型尽可能地保持愚蠢,让它们仅仅是数据表示。
我们将使用视图控制器和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]){}...

我对这种方法很满意,但它似乎有点笨拙。当从服务或控制器传递层次数据时,有没有更好的方法来维护嵌套的可观性?

frebpwbc

frebpwbc1#

我认为你有自己的 AJAX (get/post)实现 Package 在一个小库中,我们所做的是我们自己的xhrObject(jqXHR),它返回一个承诺,在我们解决该承诺的延迟之前,我们可以选择是否将属性更改为可观察的,以便视图模型实现不必处理转换每个API调用。
这是一个小东西,让你在你的方式,希望它帮助
第一个

相关问题