Underscore: _.wrap ne prend pas en charge la fonction d'encapsulation avec argument

Créé le 9 mars 2013  ·  8Commentaires  ·  Source: jashkenas/underscore

Aujourd'hui, tout en écrivant du code en utilisant le trait de soulignement et le backbone, j'ai dû envelopper certaines fonctions. J'ai vu l'exemple suivant sur underscorejs.org

var bonjour = fonction (nom) {retourne "bonjour:" + nom; };
bonjour = _.wrap (bonjour, fonction (func) {
retourne "avant", + func ("moe") + ", après";
});
Bonjour();
=> 'avant, bonjour: moe, après'

sur l'avant-dernière ligne
et si l'appel de fonction est comme
bonjour ("umar");
Je veux dire que les arguments viennent de l'extérieur.

question

Tous les 8 commentaires

Wrap s'occupe déjà de la plupart de cela pour vous. La source de wrap est assez courte à lire. Cela ou vous pouvez jeter un coup d'œil à l'exemple détaillé ci-dessous:

var greet = function(name, language){
  var response
  if (language === "sp") {
    response = "Hola"
  } else if (language === "fr") {
    response = "Bonjour"
  } else {
    response = "Hello"
  }
  return response + " " + name
}
greet("Ted", "fr"); // => "Bonjour Ted"
greet = _.wrap(greet, function(old_greet, lang){ return old_greet("Ted", lang); } );
greet("sp"); // => "Hola Ted"

Merci pour cette réponse rapide. Cela a été très utile.
J'utilise backbone pour développer une application d'entreprise.
view.js
var view = Backbone.View.extend ({

authorizeCreateAction: function () {
// ici "ceci" pointe à voir
this.createAlert: _.wrap (this.createAlert, function (_createAlert, _type) {
// autorise l'action de création
return _createAlert (_type);
});
},
createAlert: fonction (type) {
//PROBLÈME:
// Ici "this" pointe vers [window global]
}
});
voir à l'intérieur de la fonction createAlert lorsque j'appelais directement la fonction createAlert, elle pointait vers la vue, mais quand j'ai écrit la fonction wrapper, elle a commencé à pointer vers [window global]
Je veux changer la référence de ceci pour qu'il pointe vers "vue"

Je suis nouveau pour souligner, veuillez ignorer si la question n'est pas pertinente.
Le soulignement BTW est génial

Vous devrez appeler _createAlert avec un contexte comme ci-dessous. J'espère que cela pourra aider. :)

return _createAlert.call(this, _type);

il semble que le soulignement _wrap ne prenne en charge qu'un seul paramètre, utilisez ceci à la place:

fn = (fonction (fn, avant, après, soi) {
fonction de retour () {
if (before) before.apply (self, arguments);
var res = fn.apply (self, arguments);
if (after) after.apply (self, arguments);
return res;
}
}) (fn, avant, après, ceci)

Vous pouvez également utiliser partial pour ce zarehb

tnx megawac, partial est plus pour pré-remplir les arguments sans appeler une fonction avant et après

Wrap est implémenté via _.partial fyi

fn = _.partial(function(fn, before, after, self) {
    var args = _.rest(arguments, 4);
    if (before) before.apply(self,args);
    var res = fn.apply(self,args);
    if (after) after.apply(self,args);
    return res;
})(fn, before, after, this )

c'est correct et cela fonctionnera, mais au cas où quelqu'un voudrait une solution pure js, il peut prendre la mienne spécialement, l'utilisation de soulignement ne vous donne aucun avantage dans ce cas!

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

arieljake picture arieljake  ·  4Commentaires

danilopolani picture danilopolani  ·  5Commentaires

chikamichi picture chikamichi  ·  8Commentaires

jdalton picture jdalton  ·  4Commentaires

arypbatista picture arypbatista  ·  3Commentaires