2013-01-08 28 views
3

這是我今天碰到的事情,並且想知道是我做錯了什麼,或者可能是Knockout中的一個錯誤。當父對象設置爲空時,敲除失去了對內部可觀察對象的綁定

試想有來自服務器3種不同的視圖模式狀態:

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

如果我這樣做:

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

假設適當淘汰賽結合,我希望該元素的文本是「SomeText」,然後沒有,然後「DifferentText」作爲更新我的KO視圖模型通過所有三種狀態。

實際發生的是第一個狀態正常工作(文本變成「SomeText」),然後在第二個狀態文本不會改變,看起來綁定完全丟失,因爲在第三個狀態文本仍然沒有'即使現在有很好的價值可供使用。

這裏有一個展示的jsfiddle問題:

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

回答

4

我認爲,這是映射插件如何處理更新的假象。

在第一個映射中,爲InternalThing創建了一個可觀察值。

在第二個映射中,整個可觀察元素從視圖模型中移除(UI仍然綁定到它)。

在第三個映射中,爲InternalThing創建了一個新的可觀察值,該值未綁定到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/

+0

有趣。這確實有效,沒有人提供答案。我最終改變了我的模型來解決這個問題,但我會接受這個答案。 – JPRO

+0

RPN的另一個非常有用的答案。已經更新了jsfiddle工作/ CDN KO參考和一些額外的信息。 http://jsfiddle.net/bJkKp/3/ – JeffAtStepUp

相關問題