Saya memiliki footerController dan codeScannerController dengan tampilan berbeda.
angular.module('myApp').controller('footerController', ["$scope", function($scope) {}]);
angular.module('myApp').controller('codeScannerController', ["$scope", function($scope) {
console.log("start");
$scope.startScanner = function(){...
Ketika saya mengklik <li>
di footer.html saya harus mendapatkan acara ini di codeScannerController.
<li class="button" ng-click="startScanner()">3</li>
Saya pikir itu bisa diwujudkan dengan $on
dan $broadcast
, tetapi saya tidak tahu bagaimana dan tidak dapat menemukan contoh di mana pun.
javascript
angularjs
Alice Polansky
sumber
sumber
$scope.$apply()
hanya diperlukan ketika mengubah model di luar kerangka sudut (seperti di setTimeout, panggilan balik dialog, atau panggilan balik ajax), dengan kata lain$apply()
sudah dipicu setelah semua kode di.$on()
selesai.Pertama, deskripsi singkat tentang
$on()
,$broadcast()
dan$emit()
:.$on(name, listener)
- Mendengarkan acara tertentu dengan diberikanname
.$broadcast(name, args)
- Siarkan acara melalui$scope
semua anak.$emit(name, args)
- Mengeluarkan acara hingga$scope
hirarki untuk semua orang tua, termasuk$rootScope
Berdasarkan HTML berikut (lihat contoh lengkap di sini ):
Acara yang dipecat akan melintasi
$scopes
sebagai berikut:$scope
$scope
lalu$rootScope
$scope
lalu Kontroler 3$scope
$scope
lalu$rootScope
$scope
$scope
, Controller 2$scope
lalu$rootScope
$rootScope
dan$scope
semua Pengendali (1, 2 lalu 3)$rootScope
JavaScript untuk memicu peristiwa (sekali lagi, Anda dapat melihat contoh yang berfungsi di sini ):
sumber
Satu hal yang harus Anda ketahui adalah $ awalan merujuk ke Metode Angular, $$ awalan mengacu pada metode sudut yang harus Anda hindari menggunakan.
di bawah ini adalah contoh template dan pengontrolnya, kita akan mengeksplorasi bagaimana $ broadcast / $ on dapat membantu kita mencapai apa yang kita inginkan.
Kontrolernya adalah
Pertanyaan saya kepada Anda adalah bagaimana Anda memberikan nama ke pengontrol kedua ketika pengguna mengklik daftar? Anda mungkin menemukan beberapa solusi tetapi yang akan kita gunakan adalah menggunakan $ broadcast dan $ on.
$ broadcast vs $ emit
Yang mana yang harus kita gunakan? $ broadcast akan disalurkan ke semua elemen dom anak-anak dan $ emit akan menyalurkan arah yang berlawanan ke semua elemen dom leluhur.
Cara terbaik untuk menghindari memutuskan antara $ emit atau $ broadcast adalah menyalurkan dari $ rootScope dan menggunakan $ broadcast untuk semua anak-anaknya. Yang membuat kasus kami jauh lebih mudah karena elemen dom kami adalah saudara kandung.
Menambahkan $ rootScope dan memungkinkan $ broadcast
Perhatikan kami menambahkan $ rootScope dan sekarang kami menggunakan $ broadcast (broadcastName, argumen). Untuk broadcastName, kami ingin memberinya nama yang unik sehingga kami dapat menangkap nama itu di Ctrl kedua kami. Saya telah memilih BOOM! hanya untuk bersenang-senang. Argumen kedua 'argumen' memungkinkan kita memberikan nilai kepada pendengar.
Menerima siaran kami
Di pengontrol kedua kami, kami perlu mengatur kode untuk mendengarkan siaran kami
Sangat sederhana. Contoh Langsung
Cara lain untuk mencapai hasil yang serupa
Cobalah untuk menghindari menggunakan rangkaian metode ini karena tidak efisien dan tidak mudah untuk dipelihara tetapi ini adalah cara sederhana untuk memperbaiki masalah yang mungkin Anda miliki.
Anda biasanya dapat melakukan hal yang sama dengan menggunakan layanan atau dengan menyederhanakan controller Anda. Kami tidak akan membahas ini secara rinci, tetapi saya pikir saya hanya akan menyebutkannya untuk kelengkapan.
Terakhir, perlu diingat siaran yang sangat berguna untuk didengarkan adalah '$ destroy' lagi Anda dapat melihat $ berarti itu adalah metode atau objek yang dibuat oleh kode vendor. Anyways $ destroy disiarkan ketika controller hancur, Anda mungkin ingin mendengarkan ini untuk mengetahui kapan controller Anda dihapus.
sumber
sumber