Argumenten doorgeven aan gebeurtenissen in de backbone

Allereerst deed ik wat zoeken en geen antwoord op stackoverflow/google voorzag mij van wat ik wilde.

Hier is een fragment van mijn code:

//in the view
this.collection.on("add",triggerthis)
this.collection.add(predefinedModel)
triggerthis: function(a, b, c, d){
    //etc.
}

Kortom, ik wil een argument kunnen doorgeven over het toevoegen en ontvangen van het argument in triggerthis. Is dit mogelijk?

Bij voorbaat dank.

14
Aangezien de gebeurtenishandler triggerthis wordt aangeroepen door de backbone-gebeurteniscode, waar verwacht u dan dat dit extra argument zal komen?
toegevoegd de auteur Juan Enrique Muñoz Zoloto, de bron
Sorry maar ik weet niet zeker hoe dit werkt. Ik veronderstel dat ik een anonieme functie in() kan aanroepen die dit binnen triggert, maar ik weet niet zeker of dit de goede manier is om verder te gaan.
toegevoegd de auteur chenglou, de bron

2 antwoord

Je kunt dit niet op de gewenste manier doen zonder ongedocumenteerde functies te gebruiken.

Als we kijken naar Verzameling # toevoegen , Ik zal dit zien:

add: function(models, options) {
  //...
  for (i = 0, l = add.length; i < l; i++) {
    (model = add[i]).trigger('add', model, this, options);
  }
  //...
}

Noteer het vierde argument voor trigger . En als we kijken naar de gedocumenteerde interface voor trigger :

trigger object.trigger (event, [* args])

     

Start callbacks voor de gegeven event of door spaties gescheiden lijst met events. Latere argumenten voor trigger worden doorgegeven aan de callbacks van gebeurtenissen.

Dus de toevoegen roept de luisteraars op als f (model, verzameling, opties) waarbij opties dezelfde opties is wat u hebt doorgegeven aan Verzameling # voeg toe. Het resultaat is dat als je dit doet:

this.collection.add(predefinedModel, { undocumented: 'arguments' })

dan zou je dit in je callback kunnen doen:

triggerthis: function(model, collection, options) {
    console.log(options.undocumented);
}

Demo: http://jsfiddle.net/ambiguous/bqWwQ/

Natuurlijk kunt u op deze manier een hele array of object doorvoeren via opties .

Het derde argument voor "add" -gebeurtenissen is niet gedocumenteerd (althans niet dat ik kan vinden), het dichtste bij documentatie hiervoor is een notitie in de 0.3.3 Changelog-vermelding :

Het alom aanwezige opties -argument wordt nu doorgegeven als het laatste argument voor alle "change" -gebeurtenissen.

Ik zou deze benadering niet aanbevelen, maar het is er als je het nodig hebt; u zult dit natuurlijk in uw testsuite moeten bespreken en u moet ervoor zorgen dat u geen toetsen gebruikt in opties die Backbone zal gebruiken.


Een veiligere benadering zou zijn om wat extra eigenschappen aan het model toe te voegen:

model.baggage = { some: 'extra stuff };

en verwijder dat vervolgens in de callback:

triggerthis: function(model, collection) {
    var baggage = model.baggage;
    delete model.baggage;
    //...
}

Demo: http://jsfiddle.net/ambiguous/M3UaH/

U kunt ook verschillende callbacks gebruiken voor verschillende doeleinden of uw extra parameters doorgeven als volledig opgeblazen modelattributen.

Er is ook _. Bind :

this.collection.on("add", _.bind(function(collection, model, extra) { ... }, context, collection, model, 'whatever you want'));

maar dat zal argumenten van links naar rechts binden, dus je moet alles de argumenten opgeven die je callback nodig heeft.

Demo: http://jsfiddle.net/ambiguous/jUpJz/

30
toegevoegd
up-to-date - net als de bagage-techniek - werkt goed! Dankje
toegevoegd de auteur sambomartin, de bron

Als de waarden die aan de functie zijn doorgegeven altijd hetzelfde zijn, kunt u deze gedeeltelijk toepassen met behulp van _. Bind (of de native Function.bind indien beschikbaar)

Bijv. Waar u de handler verbindt met toevoegen (uitgaande van triggerThis is een methode in uw weergave):

this.collection.on('add', _.bind(this.triggerThis, this, a, b, c, d));

De definitie van triggerThis :

triggerThis: function(a, b, c, d /*, model, collection, options - if you need them*/) {
  ...
}

Als u argumenten wilt doorgeven aan een individueel gesprek toevoegen, kunt u de tweede opties parameter gebruiken voor toevoegen en vervolgens afhandelen in uw gebeurtenishandler. .

Bijv.

this.collection.on('add', this.triggerThis, this);
this.collection.add(model, {
  someCustomValue: 'hello';
});

Dan in je handler:

triggerThis: function(model, collection, options) {
  var val = options.someCustomValue;
  ...
}
6
toegevoegd
Het probleem is dat het derde argument options niet precies gedocumenteerd is.
toegevoegd de auteur mu is too short, de bron
Het argument options voor de callbacks is een soort grijs gebied, de docs praten er bijna omheen zonder meteen te zeggen dat het er is. Ik vermoed dat het op enig moment wordt gelegitimeerd. Ik wist alleen dat het de moeite waard was om te vermelden dat er enkele kanttekeningen zijn.
toegevoegd de auteur mu is too short, de bron
Het is waar, hoewel in een van de changelog-vermeldingen (voor 0.9.0) wordt vermeld dat "binnen de verzameling gebeurtenissen toevoegen en verwijderen, de index van het model dat wordt toegevoegd of verwijderd nu beschikbaar is als options.index." dus ik neem aan dat het waarschijnlijk niet snel zal verdwijnen.
toegevoegd de auteur jimr, de bron