KnockoutJS 自定义绑定范围问题
KnockoutJS custom binding scoping issue
我有一个自定义绑定,它覆盖了 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
};
在此处找到 fiddle:http://jsfiddle.net/92q5vgfp/
问题是当我尝试从 chrome 调试器访问点击内的 allBindingsAccessor 时,它不可用。
但是,如果我有 console.log(allBindingsAccessor),chrome 的调试器可以看到它。
Update 因此,当我写这篇文章时,我们尝试了一个随机的事情,即在返回函数之前将其分配给一个变量。那奏效了。不知道为什么或如何。
var wrappedValueAccessor = function() {
var test = function(data, event) {
...
};
return test;
};
所以这就是我的问题,为什么将函数分配给本地 var 并返回它工作但不直接返回它?这是 chrome 中的错误还是预期的(不知何故)?
在链接的代码段中,allBindingsAccessor 未在内部函数内部访问,因此 v8 只是对其进行了优化,不添加到函数闭包中。有关详细信息,请参阅 crbug.com/172386。
我有一个自定义绑定,它覆盖了 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
};
在此处找到 fiddle:http://jsfiddle.net/92q5vgfp/
问题是当我尝试从 chrome 调试器访问点击内的 allBindingsAccessor 时,它不可用。
但是,如果我有 console.log(allBindingsAccessor),chrome 的调试器可以看到它。
Update 因此,当我写这篇文章时,我们尝试了一个随机的事情,即在返回函数之前将其分配给一个变量。那奏效了。不知道为什么或如何。
var wrappedValueAccessor = function() {
var test = function(data, event) {
...
};
return test;
};
所以这就是我的问题,为什么将函数分配给本地 var 并返回它工作但不直接返回它?这是 chrome 中的错误还是预期的(不知何故)?
在链接的代码段中,allBindingsAccessor 未在内部函数内部访问,因此 v8 只是对其进行了优化,不添加到函数闭包中。有关详细信息,请参阅 crbug.com/172386。