Saya memiliki pengontrol dasar yang menampilkan produk saya,
App.controller('ProductCtrl',function($scope,$productFactory){
$productFactory.get().success(function(data){
$scope.products = data;
});
});
Dalam pandangan saya, saya menampilkan produk ini dalam daftar
<ul>
<li ng-repeat="product as products">
{{product.name}}
</li>
</ul
Apa yang saya coba lakukan adalah ketika seseorang mengklik nama produk, saya memiliki pandangan lain bernama keranjang tempat produk ini ditambahkan.
<ul class="cart">
<li>
//click one added here
</li>
<li>
//click two added here
</li>
</ul>
Jadi keraguan saya di sini adalah, bagaimana cara melewati produk yang diklik ini dari pengontrol pertama ke kedua? Saya berasumsi bahwa kereta harus menjadi pengontrol juga.
Saya menangani event klik menggunakan arahan. Saya juga merasa saya harus menggunakan layanan untuk mencapai fungsionalitas di atas hanya tidak tahu bagaimana caranya? karena keranjang akan ditentukan sebelumnya jumlah produk yang ditambahkan bisa 5/10 tergantung pada pengguna halaman mana. Jadi saya ingin menyimpan generik ini.
Memperbarui:
Saya membuat layanan untuk menyiarkan dan di controller kedua saya menerimanya. Sekarang pertanyaannya adalah bagaimana cara saya memperbarui dom? Karena daftar saya untuk menjatuhkan produk cukup hardcode.
sumber
Jawaban:
Dari uraian, sepertinya Anda harus menggunakan layanan. Lihat http://egghead.io/lessons/angularjs-sharing-data-between-controllers dan Layanan AngularJS Melewati Data Antar Pengendali untuk melihat beberapa contoh.
Anda dapat mendefinisikan layanan produk Anda (sebagai pabrik) sebagai berikut:
Ketergantungan memasukkan layanan ke kedua pengontrol.
Di Anda
ProductController
, tentukan beberapa tindakan yang menambahkan objek yang dipilih ke array:Di Anda
CartController
, dapatkan produk dari layanan:sumber
$http
panggilan, misalnya).Pada klik Anda dapat memanggil metode yang meminta siaran :
dan controller kedua akan mendengarkan tag ini seperti:
Karena kami tidak dapat memasukkan $ scope ke dalam layanan, tidak ada yang seperti $ scope tunggal.
Tapi kita bisa menyuntikkan
$rootScope
. Jadi, jika Anda menyimpan nilai ke dalam Layanan, Anda dapat menjalankannya$rootScope.$broadcast('SOME_TAG', 'your value');
di badan Layanan. (Lihat deskripsi @Charx tentang layanan)Silakan periksa artikel bagus tentang $ broadcast , $ emit
sumber
$rootScope.$broadcast
memberitahukan semua pengontrol yang memiliki struktur paralel alias tingkat yang sama.$watch
jika nilai ada pada$rootScope
level. Kalau tidak, hanya siaran yang bisa memberi tahu pengontrol lain. FYI, jika programmer lain melihat kode Andabroadcast
- logikanya jelas apa yang Anda coba lakukan - "siaran acara". Bagaimanapun, dari exp saya. prakteknya tidak baik untuk digunakanrootscope
untukwatch
. Tentang "fire 1st time only": lihat contoh ini: plnkr.co/edit/5zqkj7iYloeHYkzK1Prt?p=preview Anda memiliki nilai lama dan baru. pastikan bahwa setiap kali Anda mendapatkan nilai baru yang tidak sama dengan yang lamaSolusi tanpa membuat Layanan, menggunakan $ rootScope:
Untuk berbagi properti di Pengontrol aplikasi, Anda dapat menggunakan Angular $ rootScope. Ini adalah pilihan lain untuk berbagi data, menaruhnya agar orang tahu tentangnya.
Cara yang disukai untuk berbagi beberapa fungsionalitas di Pengontrol adalah Layanan, untuk membaca atau mengubah properti global yang dapat Anda gunakan $ rootscope.
Menggunakan $ rootScope dalam templat (Mengakses properti dengan $ root):
sumber
$rootScope
harus dihindari sebisa mungkin.Anda dapat melakukan ini dengan dua metode.
Dengan menggunakan
$rootscope
, tapi saya tidak merekomendasikan ini. The$rootScope
adalah paling atas lingkup. Sebuah aplikasi hanya dapat memiliki satu$rootScope
yang akan dibagikan di antara semua komponen aplikasi. Karenanya ia bertindak seperti variabel global.Menggunakan layanan. Anda dapat melakukan ini dengan berbagi layanan antara dua pengontrol. Kode untuk layanan mungkin terlihat seperti ini:
Anda bisa melihat biola saya di sini .
sumber
Cara yang bahkan lebih sederhana untuk berbagi data antara pengontrol menggunakan struktur data bersarang. Alih-alih, misalnya
kita bisa menggunakan
The
data
properti akan diwarisi dari lingkup orangtua sehingga kita dapat menimpa bidang nya, menjaga akses dari kontroler lain.sumber
sumber
kita dapat menyimpan data dalam sesi dan dapat menggunakannya di mana saja di luar program.
Tempat lain
sumber
Saya melihat jawabannya di sini, dan ini menjawab pertanyaan berbagi data antara pengontrol, tetapi apa yang harus saya lakukan jika saya ingin satu pengontrol memberi tahu yang lain tentang fakta bahwa data telah diubah (tanpa menggunakan siaran)? MUDAH! Hanya menggunakan pola pengunjung yang terkenal:
Dengan cara sederhana ini, satu pengontrol dapat memperbarui pengontrol lain yang beberapa data telah diperbarui.
sumber
Saya telah membuat pabrik yang mengontrol ruang lingkup bersama di antara pola jalur rute, sehingga Anda dapat mempertahankan data bersama hanya saat pengguna menavigasi di jalur induk rute yang sama.
Jadi, jika pengguna pergi ke jalur rute lain, misalnya '/ Dukungan', data bersama untuk jalur '/ Pelanggan' akan secara otomatis dihancurkan. Tetapi, jika alih-alih ini, pengguna pergi ke jalur 'anak', seperti '/ Pelanggan / 1' atau '/ Pelanggan / daftar' lingkup tidak akan hancur.
Anda dapat melihat contoh di sini: http://plnkr.co/edit/OL8of9
sumber
1
2
Pada klik Anda dapat memanggil metode yang meminta siaran:
3
4
5
Salah satu cara menggunakan layanan sudut:
sumber
Buat pabrik di modul Anda dan tambahkan referensi pabrik di controller dan gunakan variabelnya di controller dan sekarang dapatkan nilai data di controller lain dengan menambahkan referensi di mana pun Anda inginkan
sumber
Saya tidak tahu apakah itu akan membantu siapa pun, tetapi berdasarkan jawaban Charx (terima kasih!), Saya telah membuat layanan cache sederhana. Silakan gunakan, remix, dan bagikan:
sumber
Salah satu cara menggunakan layanan sudut:
https://jsfiddle.net/1w64222q/
sumber
FYI $ scope Object memiliki $ emit, $ broadcast, $ on AND $ rootScope Object memiliki $ emit, $ broadcast, $ on yang identik
baca lebih lanjut tentang mempublikasikan / berlangganan pola desain di sudut sini
sumber
Untuk meningkatkan solusi yang diusulkan oleh @Maxim menggunakan $ broadcast, kirim data tidak berubah
tetapi untuk mendengarkan data
sumber
Ada tiga cara untuk melakukannya,
a) menggunakan layanan
b) Mengeksploitasi tergantung hubungan orang tua / anak antara cakupan pengontrol
c) Dalam Angular 2.0 "As" kata kunci akan meneruskan data dari satu pengontrol ke yang lain.
Untuk informasi lebih lanjut dengan contoh, Silakan periksa tautan di bawah ini:
http://www.tutespace.com/2016/03/angular-js.html
sumber
Pengendali Pertama
Kontroler Kedua
sumber
saya pikir
Cara terbaik
adalah dengan menggunakan $ localStorage. (Bekerja sepanjang waktu)CardController Anda akan menjadi
Anda juga bisa menambahkan
sumber