gpt4 book ai didi

javascript - 将名称数组传递给 _.bindAll - 参数列表类型错误

转载 作者:行者123 更新时间:2023-11-28 19:26:58 25 4
gpt4 key购买 nike

我们在主干 View 中使用通用模式。我们的事件对象如下所示:

var TokenInputBaseView = Backbone.View.extend({

events: {
'click .remove-token' : 'click_removeToken',
'mousedown .add-token': 'click_addToken',
'keydown input' : 'keydown_input',
'click input' : 'click_input',
'focus .token-input' : 'focus_input',
'blur .token-input' : 'blur_input',
},

几乎在每种情况下,我们都希望所有事件处理程序绑定(bind)到 View ,而不是绑定(bind)到它们的事件对象。所以我们这样做:

initialize: function(){
_.bindAll(this, 'click_removeToken', ...);
}

我们必须手动列出每个事件名称。如果我们可以简单地传入一个数组,那将是理想的,但下划线不允许这种使用:

_.bindAll(this, _.values(this.events));

下划线希望将各个名称作为参数而不是数组传入。但是,这也行不通:

_.bindAll.apply(this, _.values(this.events).unshift(this));

Javascript 给出此错误:

"Uncaught TypeError: Function.prototype.apply: Arguments list has wrong type"

有什么好的方法可以简化bindAll的使用,这样就不需要手动列出所有要绑定(bind)的函数名称吗?

最佳答案

您正在传递bindAll返回unshift ,这是修改后的数组的长度。您需要存储数组引用,修改它,然后将该引用传递给 apply 或采用其他一些技巧:

// note, no need to bind to `this`
_.bindAll.apply(null, [this].concat(_.values(this.events)));

一个简短的例子:

var target = document.querySelector('#target');

var map = {
'foo': 'foo',
'bar': 'bar'
};

function C() {
this.value = 'Value';
_.bindAll.apply(null, [this].concat(_.values(map)));
}

C.prototype.foo = function() {
console.log('hello', this);
target.textContent = this.value + ' set by foo';
}

C.prototype.bar = function() {
return this.value;
}

var c = new C();

document.addEventListener('click', c.foo);
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min.js"></script>

<div id="target">Click me</div>

关于javascript - 将名称数组传递给 _.bindAll - 参数列表类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27697299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com