[英]Broken bindings when using KnockoutJS mapping plugin
我将KnockoutJS与ASP.NET MVC一起使用,并且在使用ko.mapping时遇到绑定断开的问题。 在我看来,我有一个文本区域,我想将Enter键绑定到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);
然后一切正常,enter会正确调用我的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。
在黑暗中拍摄,没有更多代码或jsfiddle很难说。
我已经看到了以下场景:如果您不使用3参数更新方法,则映射插件将无法更新。
尝试这个。
$.post('@Url.Action("Content", "Channel")', { channelId: channel.Id },
function(result) {
ko.mapping.fromJS(result, {}, self.channelContent);
});
顺便说一句,我会避免with绑定,它的表现非常糟糕。
编辑
实际上,这是一个jsfiddle,它对我都有效。 如果您可以更新以显示您的情况有什么不同,我可能会帮助您。
http://jsfiddle.net/madcapnmckay/52aMw/4/
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.