我将 KnockoutJS 与 ASP.NET MVC 一起使用,并且在使用 ko.mapping 时遇到了绑定损坏的问题。在我看来,我有一个文本区域,我想将输入键绑定到我的 ViewModel 上的一个方法(基本上是输入提交)。
我有以下自定义绑定:
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。