当父对象设置为null时,Knockout会丢失对内部可观察对象的绑定

时间:2013-01-08 19:35:07

标签: knockout.js knockout-mapping-plugin knockout-2.0

这是我今天遇到的事情,并且想知道这是我做错了什么,或者是Knockout中的错误。

想象一下,有三种不同的视图模型状态来自服务器:

State 1 = { AnObject: { WithString: "SomeText" } }
State 2 = { AnObject: null }
State 3 = { AnObject: { WithString: "DifferentText" } }

如果我这样做:

<p data-bind="text: AnObject.WithString"></p>

假设适当的Knockout绑定,我希望该元素的文本是“SomeText”,然后什么都没有,然后“DifferentText”作为更新我的KO视图模型通过所有三个状态。

实际发生的是第一个状态正常工作(文本变成“SomeText”),然后在第二个状态下文本不会改变,似乎绑定完全丢失,因为在第三个状态下文本仍然没有即使现在有很好的使用价值,也要改变。

这是一个证明这个问题的JSFiddle:

http://jsfiddle.net/zAuDs/4/

1 个答案:

答案 0 :(得分:4)

我认为这是映射插件如何处理更新的工件。

在第一个映射上,为InternalThing创建了一个observable。

在第二个映射中,整个observable从视图模型中移除(UI仍然绑定到它)。

在第三个映射上,为InternalThing创建了一个新的observable,它没有绑定到UI。

一种选择是强制Obj可观察,并在元素周围使用with: Obj

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

      return me;
  };

然后,绑定如:

<!-- ko with: Obj -->
<h1 data-bind="text: InternalThing">1</h1>
<!-- /ko -->

示例:http://jsfiddle.net/rniemeyer/bJkKp/