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