【问题标题】:In a knockout custom binding, how do you know which value is triggering the update?在淘汰赛自定义绑定中,您如何知道哪个值触发了更新?
【发布时间】:2018-06-11 13:52:00
【问题描述】:

B"H

我正在开发一个基于淘汰赛 js 的旧项目。 我正在尝试创建一个自定义绑定(用于 select2),但我遇到了难题,试图找出哪些属性(值)发生了变化。

即我如何知道选项列表是否刚刚更改?还是选择的值?

如果值列表刚刚更改,那么我需要重建 select2,将控件值设置为 null(否则默认选择第一项)。如果用户只是在列表中选择了一个项目,那么我真的不想做任何事情。绝对不要重建整个控件或将控件值设置为空。但是我找不到任何方法来查看哪些值发生了变化。

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    Knockout 中的每个 observable 都有订阅方法,所以如果你有

    var myProp = ko.observable();
    

    您可以订阅此道具的更改并在那里做所有必要的事情:

    myProp.subscribe(function(newValue){
      console.log("value of prop changed to " + newValue);
    });
    

    我们确实通过以下方式为 jquery selected 插件实现了自定义选择绑定:

        ko.bindingHandlers.chosen =
        {
        init: function (element, valueAccessor, allBindings) {
            var values = valueAccessor(),
                $element = $(element);
            $element.chosen(ko.toJS(values));
    
            if (ko.isObservable(values.enable)) {
                values.enable.subscribe(function (value) {
                    $element.prop('disabled', !value).trigger("chosen:updated");
                });
            }
    
            // trigger chosen:updated event when the bound value or options changes
    
            ['value', 'selectedOption', 'options'].forEach(function (e) {
                var bv = allBindings.get(e);
                if (ko.isObservable(bv))
                    bv.subscribe(function () { $(element).trigger('chosen:updated'); });
            });
    
            var prop = allBindings.get('value');
            $element.off('change');
            $element.on('change', function (obj, event) {
                if (!event || !prop) {
                    return;
                }
                if (typeof (prop()) == "number" && !isNaN(Number(event.selected))) {
                    prop(Number(event.selected));
                } else {
                    prop(event.selected);
                }
            });
        },
        update: function (element) {
            $(element).trigger('chosen:updated');
        }
    };
    

    【讨论】:

    • 感谢您的回答。在您的示例中,接缝就像一堆重复的代码。但我有一个特别的问题。如果您对所有更新使用绑定。那你为什么还要实现更新功能呢?你不会被选中:更新触发了两次?
    • 是的,你说得对,在大多数情况下它是额外的(我什至没有被调用)据我记得,这样做是为了支持在禁用/启用状态之间切换,但不确定。如果在您的情况下它可以在没有更新功能的情况下工作-您可以摆脱)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    相关资源
    最近更新 更多