Требуется объяснение функции _.bindAll() из Underscore.js
Я изучал некоторые backbone.js, и я видел множество экземпляров, где используется _.bindAll()
. Я прочитал всю страницу backbone.js и underscore.js, чтобы попытаться понять, что она делает, но я все еще очень неясен относительно того, что она делает. Ниже приведено объяснение:
_.bindAll(object, [*methodNames])
Применяет ряд методов на объект, указанный с помощью имени метода, для выполняться в контексте этого объекта когда они вызываются. Очень удобно для функций привязки, которые идут для использования в качестве обработчиков событий, которые в противном случае вызывается с помощью это бесполезно. Если ни один методNames предоставляются все объекты свойства функции будут связаны с он.
var buttonView = {
label : 'underscore',
onClick : function(){ alert('clicked: ' + this.label); },
onHover : function(){ console.log('hovering: ' + this.label); }
};
_.bindAll(buttonView);
jQuery('#underscore_button').bind('click', buttonView.onClick);
=> When the button is clicked, this.label will have the correct value...
Если вы можете помочь здесь, представив другой пример, возможно, или какое-нибудь словесное объяснение, все будет оценено. Я попытался найти больше учебных пособий или примеров, но ноль, которые служат тому, что мне нужно. Большинство людей, похоже, просто знают, что он делает автоматически...
Ответы
Ответ 1
var Cow = function(name) {
this.name = name;
}
Cow.prototype.moo = function() {
document.getElementById('output').innerHTML += this.name + ' moos' + '<br>';
}
var cow1 = new Cow('alice');
var cow2 = new Cow('bob');
cow1.moo(); // alice moos
cow2.moo(); // bob moos
var func = cow1.moo;
func(); // not what you expect since the function is called with this===window
_.bindAll(cow1, 'moo');
func = cow1.moo;
func(); // alice moos
<div id="output" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
Ответ 2
Самое простое объяснение, как для меня, следующее:
initialize:function () { //backbone initialize function
this.model.on("change",this.render); //doesn't work because of the wrong context - in such a way we are searching for a render method in the window object
this.model.on("change",this.render,this); //works fine
//or
_.bindAll(this,'render');
this.model.on("change",this.render); //now works fine
//after _.bindAll we can use short callback names in model event bindings
}
Ответ 3
попробуйте это
<input type="button" value="submit" id="underscore_button"/>
<script>
var buttonView = {
id : 'underscore',
onClick: function () {console.log('clicked: ' + this.id)},
onHover: function () {console.log('hovering: ' + this.id)}
}
_.bindAll(buttonView, 'onClick')
$('#underscore_button').click(buttonView.onClick)
$('#underscore_button').hover(buttonView.onHover)
</script>