Saya memiliki arahan bentuk yang menggunakan callback
atribut yang ditentukan dengan cakupan terisolasi:
scope: { callback: '&' }
Itu duduk di dalam ng-repeat
sehingga ekspresi yang saya berikan termasuk id
objek sebagai argumen untuk fungsi callback:
<directive ng-repeat = "item in stuff" callback = "callback(item.id)"/>
Ketika saya sudah selesai dengan arahan, ia memanggil $scope.callback()
dari fungsi pengontrolnya. Untuk sebagian besar kasus, ini baik-baik saja, dan hanya itu yang ingin saya lakukan, tetapi kadang-kadang saya ingin menambahkan argumen lain dari dalam directive
dirinya sendiri.
Apakah ada ekspresi sudut yang akan memungkinkan ini $scope.callback(arg2)
:, mengakibatkan callback
dipanggil dengan arguments = [item.id, arg2]
?
Jika tidak, apa cara paling rapi untuk melakukan ini?
Saya menemukan bahwa ini berfungsi:
<directive
ng-repeat = "item in stuff"
callback = "callback"
callback-arg="item.id"/>
Dengan
scope { callback: '=', callbackArg: '=' }
dan panggilan arahan
$scope.callback.apply(null, [$scope.callbackArg].concat([arg2, arg3]) );
Tapi saya tidak berpikir itu sangat rapi dan melibatkan memasukkan barang-barang ekstra dalam ruang lingkup isolasi.
Apakah ada cara yang lebih baik?
Bermain plunker di sini (buka konsol).
sumber
ng
API misalnyang-click="someFunction()"
adalah ekspresi yang mengevaluasi untuk mengeksekusi fungsi.$scope.callback
diatur olehcallback="someFunction"
atribut danscope: { callback: '=' }
properti objek definisi direktif.$scope.callback
adalah fungsi yang dipanggil di kemudian hari. Atribut yang sebenarnya nilai jelas string - yang selalu terjadi dengan HTML.Jawaban:
Jika Anda menyatakan panggilan balik seperti yang disebutkan oleh @ lex82 seperti
Anda dapat memanggil metode panggilan balik dalam lingkup direktif dengan peta objek dan itu akan melakukan pengikatan dengan benar. Suka
tanpa membutuhkan $ parse. Lihat biola saya (log konsol) http://jsfiddle.net/k7czc/2/
Pembaruan : Ada contoh kecil dari ini dalam dokumentasi :
sumber
Tidak ada yang salah dengan jawaban lain, tetapi saya menggunakan teknik berikut ketika meneruskan fungsi dalam atribut direktif.
Tinggalkan tanda kurung ketika menyertakan arahan dalam html Anda:
Lalu "buka" fungsi di tautan atau pengontrol direktif Anda. berikut ini sebuah contoh:
Langkah "membuka" memungkinkan fungsi dipanggil menggunakan sintaks yang lebih alami. Ini juga memastikan bahwa arahan bekerja dengan baik bahkan ketika bersarang di dalam arahan lain yang mungkin melewati fungsi. Jika Anda tidak melakukan pembungkusan, maka jika Anda memiliki skenario seperti ini:
Maka Anda akan berakhir dengan sesuatu seperti ini di dalam arahan Anda:
Yang akan gagal dalam skenario bersarang lainnya.
Saya mengadaptasi teknik ini dari artikel yang bagus oleh Dan Wahlin di http://weblogs.asp.net/dwahlin/creating-custom-angularjs-directives-part-3-isolate-scope-and-function-parameters
Saya menambahkan langkah membuka untuk membuat memanggil fungsi lebih alami dan untuk memecahkan masalah bersarang yang saya temui dalam sebuah proyek.
sumber
this
pointer di dalam metode callback, karena menggunakan ruang lingkup direktif. Saya menggunakan naskah dan panggilan balik saya terlihat seperti ini:public validateFirstName(firstName: string, fieldName: string): ng.IPromise<boolean> { var deferred = this.mQService.defer<boolean>(); ... .then(() => deferred.resolve(true)) .catch((msg) => { deferred.reject(false); }); return deferred.promise; }
Dalam direktif (
myDirective
):Dalam template direktif:
Dalam sumber:
... di mana
myFunction
didefinisikan dalam controller.Perhatikan bahwa
param
dalam templat direktif mengikat dengan rapiparam
di sumbernya, dan diatur keitem
.Untuk menelepon dari dalam
link
properti arahan ("dalamnya"), gunakan pendekatan yang sangat mirip:sumber
Ya, ada cara yang lebih baik: Anda dapat menggunakan layanan $ parse dalam direktif Anda untuk mengevaluasi ekspresi dalam konteks lingkup induk sambil mengikat pengidentifikasi tertentu dalam ekspresi ke nilai yang hanya terlihat di dalam direktif Anda:
Tambahkan baris ini ke fungsi tautan direktif tempat Anda dapat mengakses atribut direktif.
Atribut callback Anda kemudian dapat diatur seperti
callback = "callback(item.id, arg2)"
karena arg2 terikat ke yourSecondArgument oleh layanan $ parse di dalam direktif. Arahan seperting-click
memungkinkan Anda mengakses acara klik melalui$event
pengidentifikasi di dalam ekspresi yang diteruskan ke arahan dengan menggunakan mekanisme ini persis.Perhatikan bahwa Anda tidak harus membuat
callback
anggota dari ruang lingkup Anda yang terisolasi dengan solusi ini.sumber
scope.$parent
membuat arahan "bocor" - ia "tahu" terlalu banyak tentang dunia luar, yang seharusnya tidak diuraikan oleh komponen enkapsulasi yang dirancang dengan baik.Bagi saya berikut ini berhasil:
dalam direktif mendeklarasikannya seperti ini:
Dalam direktif templat gunakan dengan cara berikut:
Dan kemudian ketika Anda menggunakan arahan, berikan fungsi seperti ini:
Anda melewati fungsi dengan deklarasi dan dipanggil dari direktif dan parameter diisi.
sumber