【问题标题】:knockoutjs overriding bindinghandlersknockoutjs 覆盖绑定处理程序
【发布时间】:2012-01-25 11:45:07
【问题描述】:

您好,我正在尝试设置 ko,以便在调用任何单击处理程序时运行一些自定义代码。 将一些前置和后置代码添加到“点击”绑定处理程序的最简单方法是什么?

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    您可以创建一个自定义绑定来包装click 绑定,或者保存对click 绑定的原始initupdate 函数的引用并替换真实的。

    您可以选择在 update 函数中执行一些代码,这些代码将在模型值更新时触发(通过 init 函数中附加的事件处理程序或以编程方式),或者将您的代码作为实际的一部分执行处理程序。听起来你想要后者。

    您的绑定可能如下所示:

    (function() {
        var originalInit = ko.bindingHandlers.click.init,
            originalUpdate = ko.bindingHandlers.click.update;
    
        ko.bindingHandlers.click = {
            init: function(element, valueAccessor, allBindingsAccessor, viewModel, context) {
                var wrappedValueAccessor = function() {
                    return function(data, event) {
                       //run some pre code
                       ko.bindingHandlers.click.preOnClick.call(viewModel, data, event);
    
                       valueAccessor().call(viewModel, data, event);
    
                       //run some post code
                       ko.bindingHandlers.click.postOnClick.call(viewModel, data, event);
                    };
    
                };
    
                originalInit(element, wrappedValueAccessor, allBindingsAccessor, viewModel, context);
            },
            update: originalUpdate,
            preOnClick: function(data, event) {
                alert("pre code for " + data.id);
            },
            postOnClick: function(data, event) {
                alert("post code for " + data.id);
            }
        };
    })();
    

    我拆分了前置/后置代码,以便在运行时您可以覆盖 ko.bindingHandlers.click.preOnClickko.bindingHandlers.click.postOnClick

    这是一个示例:http://jsfiddle.net/rniemeyer/PksAn/

    如果您需要在更新函数中运行自定义代码,则可以将其拆分并在那里运行您的前置和后置代码,并在其间执行originalUpdate

    【讨论】:

    • RP,你能检查一下吗?我需要一个自定义绑定提供程序,stackoverflow.com/questions/14535102/…
    • 这应该是公认的答案,代码正确,解决方案正确。
    • @user960567 - 我的建议是尽可能使用$data.myProp。否则,更宽容的绑定提供者可能是:jsfiddle.net/rniemeyer/ruaLJ
    • 谢谢。但是您的绑定提供程序是否有任何问题。因为当我查看敲除的来源时,似乎错误来自通过本机 java 脚本代码解析 JSON 而不是敲除。使用此绑定提供程序是否有任何缺点或数据丢失/损坏的机会?
    • 视情况而定。如果您有类似withforeach 的绑定无法解析,那么它会尝试绑定孩子,就好像它不存在一样。此外,如果突然填充了未定义的值,它不会做任何事情来“重新绑定”元素。
    猜你喜欢
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    相关资源
    最近更新 更多