繁体   English   中英

使用KnockoutJS映射插件时绑定断开

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM