2012-06-19 26 views
1

我在ASP.NET MVC中使用KnockoutJS,並且在使用ko.mapping時遇到了斷開綁定的問題。在我看來,我有一個文本區域,我想將輸入鍵綁定到我的ViewModel上的一個方法(基本上輸入提交)。使用KnockoutJS映射插件時損壞的綁定

我有以下定義綁定:

ko.bindingHandlers.enterKey = { 
     init: function(element, valueAccessor, allBindingsAccessor, viewModel) { 
      ko.utils.registerEventHandler(element, 'keydown', function(evt) { 
       if (evt.keyCode === 13) { 
        evt.preventDefault(); 
        evt.target.blur(); 
        valueAccessor().call(viewModel); 
       } 
      }); 
     } 
    }; 

和我的視圖代碼看起來像:

<div class="content-area" id="container" data-bind="with: channelContent"> 
     // other code, to show content from channelContent 
     <textarea rows="1" cols="1" data-bind="value: $root.message, enterKey: $root.onMessageEnterKey"></textarea> 
</div> 

如果創建channelContent作爲ko.observable():

self.channelContent = ko.observable(); 

我用它來填充它:

$.post('@Url.Action("Content", "Channel")', { channelId: channel.Id }, self.channelContent); 

然後一切正常,輸入將正確調用我的onMessageEnterKey方法。不幸的是,因爲channelContent中有一些嵌套的屬性,我想要可觀察,所以我試圖使用ko.mapping。

如果我使用ko.mapping:

self.channelContent = ko.mapping.fromJS(@Html.Raw(Json.Encode(Model.Channel))); 

和更新的內容有:

$.post('@Url.Action("Content", "Channel")', { channelId: channel.Id }, function(result) { 
    ko.mapping.fromJS(result, self.channelContent); // update the channel content 

}); 

然後同時所有其他綁定似乎做工精細(正確更新的基本模式的變革UI), enterKey綁定停止工作。它永遠不會起火。

換句話說,只是將channelContent從簡單的ko.observable更改爲從ko.mapping初始化,會中斷enterKey。

回答

1

在黑暗中拍攝,沒有更多的代碼或jsfiddle很難說。

我見過如果不使用3參數更新方法,映射插件無法更新的場景。

試試這個。

$.post('@Url.Action("Content", "Channel")', { channelId: channel.Id }, 
function(result) { 
    ko.mapping.fromJS(result, {}, self.channelContent); 
}); 

另外,我會避免綁定,它表現得非常糟糕。

編輯

其實,這裏是一個的jsfiddle,它爲我的作品無論採用哪種方式。如果你可以更新以顯示你的情況有什麼不同,我可以幫忙。

http://jsfiddle.net/madcapnmckay/52aMw/4/

希望這有助於。

+0

如果第二個參數不包含映射調用添加的__ko_mapping__屬性,它會將其視爲映射參數,只是返回對象而不是更新它,這就是爲什麼我總是使用三個參數版本更新現有項目。 –

+0

道歉,沒有忘記答案。 jsfiddle的實現和我在做的一樣,所以我懷疑我有其他的錯誤。我會進行更多的調查,以便了解發生了什麼。 – mfanto