这是我今天遇到的事情,并且想知道这是我做错了什么,或者是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:
答案 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 -->