Underscore.js'deki _.bindAll () işlevinin açıklamasına ihtiyacınız var


85

Bazı backbone.js öğreniyorum ve _.bindAll()kullanıldığı birçok örnek gördüm . Ne yaptığına dair bir fikir edinmeye çalışmak için tüm backbone.js ve undercore.js dokümantasyon sayfasını okudum, ancak yine de ne yaptığı konusunda çok belirsizim. İşte alt çizginin açıklaması:

_.bindAll(object, [*methodNames]) 

MethodNames tarafından belirtilen nesne üzerindeki bir dizi yöntemi, çağrıldıklarında o nesnenin bağlamında çalıştırılmak üzere bağlar. Olay işleyicileri olarak kullanılacak bağlama işlevleri için çok kullanışlıdır, aksi takdirde oldukça kullanışsız bir şekilde çağrılacaktı. MethodNames sağlanmazsa, nesnenin tüm işlev özellikleri ona bağlanır.

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...

Burada başka bir örnek vererek veya sözlü bir açıklama yaparak yardımcı olabilirseniz, her şey memnuniyetle karşılanacaktır. Daha fazla öğretici veya örnek aramaya çalıştım, ancak ihtiyacım olanı karşılayan bir sonuç çıkmadı. Çoğu insan otomatik olarak ne yaptığını biliyor gibi görünüyor ...


Yanıtlar:


67

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>

Ne yazık ki gerçek "tümünü bağla" işlevi yalnızca doğrudan nesne üzerindeki işlevlerde çalışır. Prototip üzerinde tanımlanmış bir işlevi dahil etmek için, bu işlev adlarını ek bağımsız değişkenler olarak açıkça iletmeniz gerekir _.bindAll().

Her neyse, bir açıklama istediniz: Temelde, bir nesnedeki bir işlevi aynı ada ve davranışa sahip olan, ancak aynı zamanda o nesneye bağlı bir işlevle değiştirmenize olanak tanır, böylece this === theObjectonu bir yöntem ( theObject.method()) olarak çağırmadan bile .


@ThiefMaster "bu işlev adlarını ek argümanlar olarak _.bindAll () öğesine aktarın." Maalesef, örneğinizden öğrenmeye devam ediyor ve burada sonuçlarını anlamaya çalışın: yani prototip üzerinde tanımlanan işlevlerin _.bindAll altındaki nesneye otomatik olarak bağlı olmadığını söylüyorsunuz ve bunu başaracak biri varsa, nesne ile ilk parametre; ikinci parametre, işlevin adı, bu işlev prototip üzerinde tanımlanmışsa?
Nik So

9
Yehuda Katz'ın bu blog yazısıthis JavaScript'te çok iyi açıklıyor .
Henrik N

9

Benim için en basit açıklama şu:

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
}

-2

bunu dene

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.