Knockout.js工作流程与绘图插件(Knockout.js Workflow with Map

2019-10-20 05:45发布

我不知道我的理解内部Knockout.js遵循工作流程。 我有一个是动态定义的,使用映射插件一个ViewModel。 它的形状是:

{ current: { foo: 'foo', bar: 'bar', id: 0 }
, ids:     [1,2,3,4,5] 
}

每个那些ids对应于可在所属的值current 。 现在,并发症进来,因为在最初的ajax请求来填充我的视图模型,服务器响应current: null 。 我已经写代码,以第一id出的列表中ids和运行另一个AJAX查询来填充current 。 这看起来是这样的:

var ViewModel = function (data) {
  var self = this;
  ko.mapping.fromJS(data, {}, self);

  self.head = function () {
    if (self.promptIds().length != 0) {
      var nextId = _.head(self.promptIds());
      self.promptIds(_.tail(self.promptIds()));
      $.getJSON("my-url" + "/" + nextId, function (data) {
        self.current(ko.mapping.fromJS(data));
      });
    }
  }
}


$('document').ready ( function () {
  $.getJSON("view-model-route", function (data) {
    viewModel = new ViewModel(data);
    viewModel.head();
    ko.applyBindings(viewModel);
  });
});

请注意,在第二块,我创建了一个新的ViewModel对象,我叫head()就可以了。 一旦viewModel.current()对象填充,我叫ko.applyBindings的完整viewModel 。 我可以证实,当所有的尘埃落定, viewModel.currentnull 。 但我仍然得到错误:

Uncaught TypeError: Unable to parse bindings.
  Bindings value: text: current().foo
  Message: Cannot read property 'foo' of null

上午我试图做一些淘汰赛并不是用来做什么? 我需要另一个抽象层? 你会如何处理这个情况呢?

Answer 1:

当你调用绑定首先评估ko.applyBindings

所以,如果您的current属性包含null到那个时候那么这是正常的,你得到一个Cannot read property 'foo' of null例外。

有多种解决了这个问题:

  • 初始化current用空的对象,因此该current().foo将被正确地解析(但其值被undefined ):

     viewModel = new ViewModel(data); viewModel.head(); viewModel.current({}); ko.applyBindings(viewModel); 
  • 您可以在绑定来检查添加额外的条件current有一定的价值:

     <input type="text" data-bind="value: current() && current().foo" /> 
  • 或可能是最好的,最值得推荐的是使用with约束力的 ,如果你正在处理嵌套proeprties:

     <!-- ko with: current --> <input type="text" data-bind="value: foo" /> <!-- /ko --> 

演示的jsfiddle 。



文章来源: Knockout.js Workflow with Mapping plugin