Apakah mungkin untuk menggunakan satu pengontrol menggunakan yang lain?
Sebagai contoh:
Dokumen HTML ini hanya mencetak pesan yang dikirim oleh MessageCtrl
pengontrol dalam messageCtrl.js
file.
<html xmlns:ng="http://angularjs.org/">
<head>
<meta charset="utf-8" />
<title>Inter Controller Communication</title>
</head>
<body>
<div ng:controller="MessageCtrl">
<p>{{message}}</p>
</div>
<!-- Angular Scripts -->
<script src="http://code.angularjs.org/angular-0.9.19.js" ng:autobind></script>
<script src="js/messageCtrl.js" type="text/javascript"></script>
</body>
</html>
File pengontrol berisi kode berikut:
function MessageCtrl()
{
this.message = function() {
return "The current date is: " + new Date().toString();
};
}
Yang hanya mencetak tanggal saat ini;
Jika saya menambahkan pengontrol lain, DateCtrl
yang mengembalikan tanggal dalam format tertentu MessageCtrl
, bagaimana cara melakukannya? Kerangka kerja DI tampaknya berkaitan dengan XmlHttpRequests
dan mengakses layanan.
javascript
html
angularjs
BanksySan
sumber
sumber
Jawaban:
Ada beberapa cara bagaimana berkomunikasi antar pengendali.
Yang terbaik mungkin berbagi layanan:
Cara lain adalah memancarkan acara pada lingkup:
Dalam kedua kasus, Anda dapat berkomunikasi dengan arahan apa pun juga.
sumber
Lihat biola ini: http://jsfiddle.net/simpulton/XqDxG/
Tonton juga video berikut: Communicating Between Controllers
Html:
javascript:
sumber
Jika Anda ingin memanggil satu pengontrol ke yang lain ada empat metode yang tersedia
Kontroler dan cakupannya bisa dihancurkan, tetapi $ rootScope tetap ada di seluruh aplikasi, itu sebabnya kami mengambil $ rootScope karena $ rootScope adalah induk dari semua lingkup.
Jika Anda melakukan komunikasi dari orang tua ke anak dan bahkan anak ingin berkomunikasi dengan saudara kandungnya, Anda dapat menggunakan $ broadcast
Jika Anda melakukan komunikasi dari anak ke orang tua, tidak ada saudara yang terlibat maka Anda dapat menggunakan $ rootScope. $ Emit
HTML
Kode Angular
Dalam kode di atas konsol $ emit 'childEmit' tidak akan memanggil saudara dalam dan itu akan memanggil orangtua hanya di dalam, di mana $ broadcast dipanggil di dalam saudara dan orang tua juga. Ini adalah tempat di mana kinerja beraksi. $ Emit adalah lebih disukai, jika Anda menggunakan komunikasi anak ke orang tua karena itu melewatkan beberapa pemeriksaan kotor.
Ini salah satu metode terbaik, Jika Anda ingin melakukan komunikasi orang tua anak di mana anak ingin berkomunikasi dengan orang tua langsung maka itu tidak memerlukan $ broadcast atau $ emit tetapi jika Anda ingin melakukan komunikasi dari orang tua ke anak maka Anda harus baik menggunakan layanan atau $ broadcast
Misalnya HTML: -
Angularjs
Setiap kali Anda menggunakan komunikasi child to parent, Angularjs akan mencari variabel inside child, Jika tidak ada di dalamnya maka ia akan memilih untuk melihat nilai-nilai di dalam pengontrol induk.
AngularJS mendukung konsep "Seperation of Concerns" menggunakan arsitektur layanan. Layanan adalah fungsi javascript dan bertanggung jawab untuk melakukan tugas tertentu saja. Ini menjadikannya entitas individu yang dapat dipelihara dan diuji. Layanan yang digunakan untuk menyuntikkan menggunakan Dependency Injection mecahnism dari Angularjs.
Kode angularjs:
Ini akan memberikan output Hello Child World dan Hello Parent World. Menurut dokumen Angular dari layanan Singletons - Setiap komponen yang bergantung pada layanan mendapat referensi ke instance tunggal yang dihasilkan oleh pabrik layanan .
Metode ini mendapatkan scope () dari elemen dengan metode Id / unique class.angular.element () mengembalikan elemen dan scope () memberikan variabel $ scope dari variabel lain menggunakan $ scope variable dari satu pengontrol di dalam pengontrol lain bukanlah praktik yang baik.
HTML: -
Angularjs: -
Dalam pengendali kode di atas menunjukkan nilai mereka sendiri pada Html dan ketika Anda akan mengklik teks Anda akan mendapatkan nilai-nilai di konsol yang sesuai. Jika Anda mengklik rentang pengendali induk, browser akan menghibur nilai anak dan sebaliknya.
sumber
Berikut adalah contoh satu halaman dari dua pengontrol yang membagikan data layanan:
Juga di sini: https://gist.github.com/3595424
sumber
theService
updatething.x
, maka bahwa perubahan otomatis propageates ke <input> s diFirstCtrl
danSecondCtrl
, kan? Dan seseorang juga dapat mengubahthing.x
secara langsung melalui salah satu dari dua <input> (kan?).Jika Anda ingin memancarkan & menyiarkan acara untuk berbagi data atau fungsi panggilan di seluruh pengontrol , silakan lihat tautan ini : dan periksa jawabannya dengan
zbynour
(menjawab dengan suara maksimal). Saya mengutip jawabannya !!!Jika ruang lingkup firstCtrl adalah induk dari ruang lingkup secondCtrl, kode Anda harus bekerja dengan mengganti $ emit dengan $ broadcast di firstCtrl:
Jika tidak ada hubungan orangtua-anak di antara cakupan Anda, Anda bisa menyuntikkan $ rootScope ke controller dan menyiarkan acara ke semua cakupan anak (yaitu juga secondCtrl).
Akhirnya, ketika Anda perlu mengirim acara dari child controller ke cakupan Anda dapat menggunakan $ scope. $ Emit Jika cakupan firstCtrl adalah induk dari lingkup secondCtrl:
sumber
Dua biola lagi: (Pendekatan non-layanan)
1) Untuk Pengontrol Orangtua-Anak - Menggunakan
$scope
pengontrol induk untuk memancarkan / menyiarkan acara. http://jsfiddle.net/laan_sachin/jnj6y/2) Menggunakan
$rootScope
seluruh pengontrol yang tidak terkait. http://jsfiddle.net/VxafF/sumber
Sebenarnya menggunakan memancarkan dan menyiarkan tidak efisien karena peristiwa menggelembung naik dan turunnya hierarki ruang lingkup yang dapat dengan mudah menurunkan ke kinerja bottlement untuk aplikasi yang kompleks.
Saya akan menyarankan menggunakan layanan. Inilah cara saya baru-baru ini mengimplementasikannya di salah satu proyek saya - https://gist.github.com/3384419 .
Ide dasar - daftarkan bus pub-sub / acara sebagai layanan. Kemudian menyuntikkan bus acara itu di mana pun Anda perlu berlangganan atau mempublikasikan acara / topik.
sumber
Saya juga tahu cara ini.
Tapi saya tidak menggunakannya terlalu banyak, karena saya tidak suka menggunakan pemilih jQuery dalam kode sudut.
sumber
Ada metode yang tidak tergantung pada layanan,
$broadcast
atau$emit
. Ini tidak cocok dalam semua kasus, tetapi jika Anda memiliki 2 pengontrol terkait yang dapat diabstraksikan menjadi arahan, maka Anda dapat menggunakanrequire
opsi dalam definisi arahan. Ini kemungkinan besar bagaimana ngModel dan ngForm berkomunikasi. Anda bisa menggunakan ini untuk berkomunikasi antara pengontrol direktif yang bersarang, atau pada elemen yang sama.Untuk situasi orang tua / anak, penggunaannya adalah sebagai berikut:
Dan poin utama untuk membuatnya bekerja: Pada arahan induk, dengan metode yang akan dipanggil, Anda harus mendefinisikannya
this
(bukan pada$scope
):Pada definisi arahan anak, Anda dapat menggunakan
require
opsi sehingga pengontrol induk diteruskan ke fungsi tautan (sehingga Anda dapat memanggil fungsi di dalamnya dariscope
arahan anak.Di atas dapat dilihat di http://plnkr.co/edit/poeq460VmQER8Gl9w8Oz?p=preview
Arahan saudara digunakan sama, tetapi kedua arahan pada elemen yang sama:
Digunakan dengan membuat metode pada
directive1
:Dan dalam directive2 ini dapat dipanggil dengan menggunakan
require
opsi yang menghasilkan siblingController diteruskan ke fungsi tautan:Ini bisa dilihat di http://plnkr.co/edit/MUD2snf9zvadfnDXq85w?p=preview .
Penggunaan ini?
Induk: Setiap kasus di mana elemen anak perlu "mendaftar" sendiri dengan orangtua. Sama seperti hubungan antara ngModel dan ngForm. Ini dapat menambahkan perilaku tertentu yang dapat memengaruhi model. Anda mungkin memiliki sesuatu yang murni berdasarkan DOM, di mana elemen induk perlu mengelola posisi anak-anak tertentu, misalnya mengelola atau bereaksi terhadap pengguliran.
Sibling: memungkinkan arahan untuk mengubah perilakunya. ngModel adalah kasus klasik, untuk menambahkan parser / validasi ke ngModel digunakan pada input.
sumber
Saya tidak tahu apakah ini di luar standar tetapi jika Anda memiliki semua pengontrol Anda pada file yang sama, maka Anda dapat melakukan sesuatu seperti ini:
Seperti yang Anda lihat indikatorCtrl memanggil fungsi updateChart dari kedua pengendali lainnya saat memanggil updateCharts.
sumber
Anda dapat menyuntikkan layanan '$ controller' di controller induk Anda (MessageCtrl) dan kemudian instantiate / inject child controller (DateCtrl) menggunakan:
$scope.childController = $controller('childController', { $scope: $scope.$new() });
Sekarang Anda dapat mengakses data dari pengontrol anak Anda dengan memanggil metodenya karena ini adalah layanan.
Beri tahu saya jika ada masalah.
sumber
Berikut ini adalah a
publish-subscribe
pendekatan yang terlepas dari JS Angular.Cari Param Controller
Kontrol Pilihan Pencarian
Pengelola acara
Global
sumber
Dalam sudut 1,5 ini dapat dilakukan dengan melakukan hal berikut:
Ini adalah komponen induk. Dalam hal ini saya telah membuat sebuah fungsi yang mendorong objek lain ke dalam
productForms
array saya - note - ini hanya contoh saya, fungsi ini bisa apa saja.Sekarang kita dapat membuat komponen lain yang akan menggunakan
require
:Di sini komponen anak membuat referensi ke fungsi komponen orang tua
addNewForm
yang kemudian dapat diikat ke HTML dan dipanggil seperti fungsi lainnya.sumber