Underscore: _.wrap tidak mendukung fungsi pembungkusan dengan argumen

Dibuat pada 9 Mar 2013  ·  8Komentar  ·  Sumber: jashkenas/underscore

Hari ini saat menulis kode menggunakan garis bawah dan tulang punggung saya harus membungkus beberapa fungsi. Saya melihat contoh berikut di underscorejs.org

var hello = function (name) {return "hello:" + name; };
halo = _.wrap (halo, fungsi (func) {
return "before," + func ("moe") + ", after";
});
Halo();
=> 'sebelumnya, halo: moe, setelah'

di baris terakhir kedua
bagaimana jika pemanggilan fungsi seperti
halo ("umar");
Maksud saya, argumen datang dari luar.

question

Semua 8 komentar

Bungkus sudah menangani sebagian besar ini untuk Anda. Sumber bungkus cukup singkat untuk dibaca. Itu atau Anda dapat melihat contoh tambahan di bawah ini:

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"

Terima kasih atas tanggapan cepat ini. Itu sangat membantu.
Saya menggunakan tulang punggung untuk mengembangkan aplikasi perusahaan.
view.js
var view = Backbone.View.extend ({

authorizeCreateAction: function () {
// di sini "ini" menunjuk untuk dilihat
this.createAlert: _.wrap (this.createAlert, function (_createAlert, _type) {
// otorisasi buat tindakan
return _createAlert (_type);
});
},
createAlert: function (type) {
//MASALAH:
// Di sini "ini" mengarah ke [window global]
}
});
lihat di dalam fungsi createAlert ketika saya memanggil fungsi createAlert secara langsung, itu menunjuk ke tampilan tetapi ketika saya menulis fungsi pembungkus itu mulai menunjuk ke [window global]
Saya ingin mengubah referensi ini menjadi menunjuk ke "tampilan"

Saya baru menggarisbawahi, abaikan jika pertanyaan tidak relevan.
Garis bawah BTW mengagumkan

Anda harus menelepon _createAlert dengan konteks seperti di bawah ini. Semoga membantu. :)

return _createAlert.call(this, _type);

tampaknya garis bawah _wrap hanya mendukung satu parameter, gunakan ini sebagai gantinya:

fn = (function (fn, before, after, self) {
fungsi kembali () {
if (before) before.apply (self, arguments);
var res = fn.apply (self, arguments);
if (after) after.apply (self, arguments);
res kembali;
}
}) (fn, sebelum, sesudah, ini)

Anda juga dapat menggunakan parsial untuk zarehb itu

tnx megawac, parsial lebih untuk mengisi argumen yang tidak memanggil fungsi sebelum dan sesudah

Bungkus diimplementasikan melalui _.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 )

itu benar dan itu akan berhasil, tetapi jika ada yang menginginkan solusi js murni dapat mengambil milik saya khususnya bahwa menggunakan garis bawah tidak memberi Anda manfaat apa pun dalam kasus ini!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

marcalj picture marcalj  ·  5Komentar

arypbatista picture arypbatista  ·  3Komentar

chikamichi picture chikamichi  ·  8Komentar

danilopolani picture danilopolani  ·  5Komentar

jdalton picture jdalton  ·  6Komentar