我在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。
如果第二個參數不包含映射調用添加的__ko_mapping__屬性,它會將其視爲映射參數,只是返回對象而不是更新它,這就是爲什麼我總是使用三個參數版本更新現有項目。 –
道歉,沒有忘記答案。 jsfiddle的實現和我在做的一樣,所以我懷疑我有其他的錯誤。我會進行更多的調查,以便了解發生了什麼。 – mfanto