Jika saya memiliki pengontrol berikut:
function parent($scope, service) {
$scope.a = 'foo';
$scope.save = function() {
service.save({
a: $scope.a,
b: $scope.b
});
}
}
function child($scope) {
$scope.b = 'bar';
}
Apa cara yang tepat untuk membiarkan parent
membaca b
dari child
? Jika itu perlu untuk mendefinisikan b
di parent
, tidak akan yang membuatnya semantik tidak benar dengan asumsi bahwa b
adalah properti yang menggambarkan sesuatu yang berhubungan denganchild
dan tidak parent
?
Update: Berpikir lebih lanjut tentang hal itu, jika lebih dari satu anak memiliki b
itu akan menciptakan konflik untuk parent
yang b
untuk mengambil. Pertanyaan saya tetap, apa cara yang tepat untuk akses b
dari parent
?
Jawaban:
Cakupan di AngularJS menggunakan pewarisan prototipe, ketika mencari properti di lingkup anak, penerjemah akan mencari rantai prototipe mulai dari anak dan berlanjut ke orang tua hingga menemukan properti, bukan sebaliknya.
Periksa komentar Vojta tentang masalah tersebut https://groups.google.com/d/msg/angular/LDNz_TQQiNE/ygYrSvdI0A0J
Singkatnya: Anda tidak dapat mengakses cakupan anak dari lingkup induk.
Solusi Anda:
$emit
mengirim peristiwa ke atas ke orang tua sampai cakupan root dan$broadcast
mengirim peristiwa ke bawah. Ini dapat membantu Anda untuk menjaga segala sesuatunya benar secara semantik.sumber
localStorage
dengan ketergantungan sepertingStorage
.Meskipun jawaban jm-adalah cara terbaik untuk menangani kasus ini, untuk referensi di masa mendatang dimungkinkan untuk mengakses cakupan anak menggunakan anggota $$ childHead, $$ childTail, $$ nextSibling dan $$ prevSibling dari suatu cakupan. Ini tidak didokumentasikan sehingga mungkin berubah tanpa pemberitahuan, tetapi mereka ada di sana jika Anda benar - benar perlu melintasi cakupan.
Biola
sumber
Anda bisa mencoba ini:
lalu di pengontrol anak (cakupan) tambahkan:
Sekarang orang tua memiliki akses ke ruang lingkup anak.
sumber
Salah satu solusi yang mungkin adalah menyuntikkan pengontrol anak di pengontrol induk menggunakan fungsi init.
Penerapan yang mungkin:
Di mana
ChildController
Anda memiliki:Jadi sekarang
ParentController
Anda dapat menggunakan:Penting:
Untuk bekerja dengan baik Anda harus menggunakan direktif
ng-controller
dan mengganti nama setiap pengontrol menggunakanas
seperti yang saya lakukan di html misalnya.Tips:
Gunakan plugin chrome ng-inspector selama proses. Ini akan membantu Anda memahami pohon itu.
sumber
Menggunakan $ emit dan $ broadcast , (seperti yang disebutkan oleh walv di komentar di atas)
Untuk mengaktifkan acara ke atas (dari anak ke orang tua)
Untuk mengaktifkan peristiwa ke bawah (dari orang tua ke anak)
dan akhirnya mendengarkan
Untuk detail lebih lanjut: - https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
Nikmati :)
sumber
Ya, kita dapat menetapkan variabel dari pengontrol anak ke variabel di pengontrol induk. Ini adalah salah satu cara yang mungkin:
Gambaran: Tujuan utama kode, di bawah ini, adalah untuk menetapkan $ scope.variable pengontrol anak ke $ scope.assign pengontrol induk
Penjelasan: Ada dua pengontrol. Di html, perhatikan bahwa pengontrol induk menyertakan pengontrol turunan. Itu berarti pengontrol induk akan dieksekusi sebelum pengontrol anak. Jadi, setValue () pertama akan ditentukan dan kemudian kontrol akan menuju ke kontroler anak. $ scope.variable akan ditetapkan sebagai "anak". Kemudian lingkup anak ini akan diteruskan sebagai argumen ke fungsi pengontrol induk, di mana $ scope.assign akan mendapatkan nilai sebagai "anak"
sumber