KnockoutJS自定义绑定作用域问题

KnockoutJS custom binding scoping issue

本文关键字:问题 作用域 绑定 自定义 KnockoutJS      更新时间:2023-09-26

我有一个自定义绑定,覆盖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/

问题是,当我试图访问allBindingsAccessor点击从chrome调试器,它是不可用的。

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

Update所以,当我写这篇文章的时候,我们尝试了一个随机的事情,那就是在返回它之前将函数分配给一个变量。这工作。不知道为什么,也不知道怎么回事。

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

所以这是我的问题,为什么将函数分配给局部变量并返回它的工作,但不直接返回它?这是一个bug在chrome或预期(不知何故)?

在链接的代码段中,没有在内部函数中访问allBindingsAccessor,因此v8只是将其优化出来,而不添加到函数闭包中。详见crbug.com/172386