【问题标题】:Knockout JS. Applying extenders to all observables within ViewModel?淘汰赛JS。将扩展器应用于 ViewModel 中的所有可观察对象?
【发布时间】:2013-05-25 02:12:43
【问题描述】:

有没有办法在 KnockoutJS 中为 ViewModel 设置全局配置?

两种可能的用例可能是:

查看 Knockout Validation Plugin 源代码,我发现在创建验证的Observable() 时,它实际上将所有子字段分组到一个 observableArray() 中,然后遍历并应用 obj.extend({ validatable: true });。创建这样的循环是最好的方法吗?像self.firstName = ko.observable().trimmed()这样的唯一其他替代编写代码吗?

  • 将默认事件从“change”全局更改为“afterkeydown”。

我看到我可以使用<input data-bind="value: name, valueUpdate: 'afterkeydown'" />,但有没有办法可以通过编程方式或默认将其应用于每个输入? 这个仍然是首选解决方案吗:How can I get Knockout JS to data-bind on keypress instead of lost-focus?

  • 最后,是否有另一种方法可以在 更改和按键时触发事件?

谢谢!

【问题讨论】:

    标签: knockout.js knockout-2.0


    【解决方案1】:

    在你想处理多个事件时,最好使用自定义绑定:

    JSFIDDLE

    ko.bindingHandlers.onChange = {
        init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
            // This will be called when the binding is first applied to an element
            // Set up any initial state, event handlers, etc. here
            var value = valueAccessor();
            var el = $(element);
            el.on({
                change: function () {
                    value(el.val());
                },
                keyup: function () {
                    value(el.val());
                }
            });
        },
        update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
            // This will be called once when the binding is first applied to an element,
            // and again whenever the associated observable changes value.
            // Update the DOM element based on the supplied values here.
        }
    };
    
    var model = {
        name: ko.observable('John')
    };
    
    ko.applyBindings(model);
    

    HTML:

    <input type="text" data-bind="onChange: name, value: name" />
    <div data-bind="text: name"></div>
    

    【讨论】:

    • 太棒了。有道理,谢谢。至于将扩展器应用于多个可观察对象,我最好创建然后迭代 observableArray 吗?
    • 关于扩展器,迭代它们听起来很合理。
    猜你喜欢
    • 2016-11-09
    • 2014-08-08
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    相关资源
    最近更新 更多