Hoje, enquanto escrevia código usando sublinhado e backbone, tive que encapsular algumas funções. Eu vi o exemplo a seguir em underscorejs.org
var hello = function (name) {return "hello:" + name; };
hello = _.wrap (hello, function (func) {
retornar "antes," + func ("moe") + ", depois de";
});
Olá();
=> 'antes, olá: moe, depois'
na penúltima linha
e se a chamada de função for como
olá ("umar");
Quero dizer que os argumentos vêm de fora.
Wrap já cuida de quase tudo para você. O código-fonte para embrulhar é bem curto para ler. Isso ou você pode dar uma olhada no exemplo estendido abaixo:
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"
Obrigado por esta resposta rápida. Foi muito útil.
Estou usando o backbone para desenvolver um aplicativo corporativo.
view.js
var view = Backbone.View.extend ({
authorizeCreateAction: function () {
// aqui "isto" aponta para ver
this.createAlert: _.wrap (this.createAlert, function (_createAlert, _type) {
// autoriza a ação de criação
return _createAlert (_type);
});
},
createAlert: function (type) {
//PROBLEMA:
// Aqui, "this" aponta para [janela global]
}
});
ver dentro da função createAlert quando eu estava chamando a função createAlert diretamente, ela estava apontando para view, mas quando eu escrevi função wrapper ela começou a apontar para [window global]
Eu quero mudar a referência disso para apontar para "vista"
Sou novo no sublinhado, por favor, ignore se a pergunta for irrelevante.
O sublinhado BTW é incrível
Você precisará chamar _createAlert
com um contexto como o abaixo. Espero que ajude. :)
return _createAlert.call(this, _type);
parece que o sublinhado _wrap suporta apenas um parâmetro, use este em seu lugar:
fn = (função (fn, antes, depois, self) {
return function () {
if (before) before.apply (self, argumentos);
var res = fn.apply (self, argumentos);
if (after) after.apply (self, argumentos);
return res;
}
}) (fn, antes, depois disso)
Você também pode usar parcial para esse zarehb
tnx megawac, partial é mais para pré-preencher os argumentos e não chamar uma função antes e depois
Wrap é implementado 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 )
está correto e vai funcionar, mas caso alguém queira uma solução js pura pode levar a minha especialmente que usar o sublinhado não traz nenhum benefício neste caso!