KnockoutJS自定义绑定范围问题

时间:2015-09-02 20:14:33

标签: javascript google-chrome knockout.js google-chrome-devtools

我有一个自定义绑定,它会覆盖knockout的点击处理程序,如下所示:

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) {
                var disabled = allBindingsAccessor.get('disabled');
                var clickResult = valueAccessor().call(viewModel, data, event);

                if (clickResult && typeof clickResult.always === "function") {
                    $(element).attr('disabled','disabled');
                    clickResult.always(function(){
                        $(element).removeAttr('disabled');
                    });
                }

            };

        };

        originalInit(element, wrappedValueAccessor, allBindingsAccessor, viewModel, context);
    },
    update: originalUpdate
};

在此处找到小提琴:http://jsfiddle.net/92q5vgfp/

问题是当我尝试在chrome调试器中点击内部访问allBindingsAccessor时,它不可用。

但是,如果我有一个console.log(allBindingsAccessor),chrome的调试器就可以看到它。

更新所以,在我写这篇文章时,我们尝试了一个随机的东西,即在返回之前将函数分配给变量。那很有效。不知道为什么或如何。

var wrappedValueAccessor = function() {
            var test = function(data, event) {
                ...
            };
            return test;
};

所以这是我的问题,为什么将函数分配给本地var并返回它工作但不直接返回它?这是铬或预期的错误(不知何故)?

1 个答案:

答案 0 :(得分:0)

在链接的代码段中,不会在内部函数内部访问allBindingsAccessor,因此v8只是将其优化出来并且不会添加到函数闭包中。有关详细信息,请参阅crbug.com/172386