【问题标题】:knockout.js changing the hasfocus value does not update binding valueknockout.js 更改 hasfocus 值不会更新绑定值
【发布时间】:2012-09-12 08:31:16
【问题描述】:

我有http://jsfiddle.net/ksCSn/1/

HTML

<input type="text" data-bind="                                                                             
value: title,
hasfocus: edit,
onEnter: stopEdit" />

<p data-bind="text: title"></p>

JS

ko.bindingHandlers.onEnter = {
    init: function(element, valueAccessor, _, viewModel) {
        ko.utils.registerEventHandler(element, 'keydown', function(evt) {
            if (evt.keyCode === 13)
                valueAccessor().call(viewModel);
        });
    }
}

function ViewModel() {
    this.title = ko.observable("default value");
    this.edit = ko.observable(false);
    this.stopEdit = function() {
        this.edit(false);

        // If the edit update is in a timeout, then it works
        // var edit = this.edit;
        // setTimeout(function() { edit(false); }, 0);
    };
}

ko.applyBindings(new ViewModel());

为什么在输入框编辑时按下回车键,值没有更新?

如果我更改编辑更新,使其作为超时排队,那么它可以工作。这是为什么呢?

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    这是因为 Knockout 中的一个“错误”(请参阅​​ https://github.com/SteveSanderson/knockout/issues/321)导致所有绑定一起更新。当您更改 edit 属性时,它会更新 hasfocus 绑定以模糊该字段,并且由于该错误,它也会更新 value 绑定。因为绑定按列出的顺序运行,所以value 绑定首先更新,这会覆盖视图模型中值为title 的字段。

    解决此问题的一个简单更改是重新排序绑定,以便 hasfocus 将首先运行:http://jsfiddle.net/mbest/ksCSn/8/

    【讨论】:

      【解决方案2】:

      回车时你应该使用模糊,我已经调整了your JS Fiddle

      但是 m.b 你应该尝试使用另一个事件来更新值而不是按 enter 来改变值?例如afterkeydownJs Fiddle

      另见KnockoutJS documentation

      【讨论】:

        【解决方案3】:

        ValueAccessor 是一个函数,它将评估为普通属性或 ko.observable,具体取决于您传递给绑定的内容。

        在您的示例中,您传递的是 stopEdit 函数,因此:

        valueAccessor().call(viewModel)
        

        等于

        viewModel.stopEdit.call(viewModel)
        

        将 viewModel 传递给函数会将范围从 this 重置为您的 viewModel。 在您的示例中,这将有效地将您的 viewModel 的编辑属性设置为 false,因此您也可以将其写为

        viewModel.edit(false);
        

        这里的问题是您混淆了事件,请参阅 U10 的答案以获得解决此问题的更好方法。

        【讨论】:

        • valueAccessor 实际上是一个返回可观察或普通属性的函数。它不是可观察的或直接的属性。您需要先调用 valueAccessor() 才能访问 observable/property。
        • @RPNiemeyer 是的,我想我的回答不够清楚,我已经更新了你的解释。谢谢!
        猜你喜欢
        • 1970-01-01
        • 2023-03-28
        • 2017-12-08
        • 1970-01-01
        • 2012-01-07
        • 1970-01-01
        • 2015-10-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多