3

这是我今天遇到的问题,想知道这是我做错了什么还是 Knockout 中的错误。

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

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/

4

1 回答 1

4

我相信这是映射插件如何处理更新的产物。

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

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

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

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

  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/

于 2013-01-09T03:17:17.087 回答