Saya mencoba berbagi data di seluruh pengontrol. Use-case adalah bentuk multi-langkah, data yang dimasukkan dalam satu input kemudian digunakan di beberapa lokasi tampilan di luar pengontrol asli. Kode di bawah dan di jsfiddle di sini .
HTML
<div ng-controller="FirstCtrl">
<input type="text" ng-model="FirstName"><!-- Input entered here -->
<br>Input is : <strong>{{FirstName}}</strong><!-- Successfully updates here -->
</div>
<hr>
<div ng-controller="SecondCtrl">
Input should also be here: {{FirstName}}<!-- How do I automatically updated it here? -->
</div>
JS
// declare the app with no dependencies
var myApp = angular.module('myApp', []);
// make a factory to share data between controllers
myApp.factory('Data', function(){
// I know this doesn't work, but what will?
var FirstName = '';
return FirstName;
});
// Step 1 Controller
myApp.controller('FirstCtrl', function( $scope, Data ){
});
// Step 2 Controller
myApp.controller('SecondCtrl', function( $scope, Data ){
$scope.FirstName = Data.FirstName;
});
Setiap bantuan sangat dihargai.
javascript
angularjs
johnkeese
sumber
sumber
Jawaban:
Solusi sederhana adalah membuat pabrik Anda mengembalikan objek dan membiarkan controller Anda bekerja dengan referensi ke objek yang sama:
JS:
HTML:
Demo: http://jsfiddle.net/HEdJF/
Ketika aplikasi menjadi lebih besar, lebih kompleks dan lebih sulit untuk diuji, Anda mungkin tidak ingin mengekspos seluruh objek dari pabrik dengan cara ini, tetapi sebaliknya memberikan akses terbatas misalnya melalui getter dan setter:
Dengan pendekatan ini, tergantung pada pengontrol yang mengonsumsi untuk memperbarui pabrik dengan nilai-nilai baru, dan untuk melihat perubahan untuk mendapatkannya:
HTML:
Demo: http://jsfiddle.net/27mk1n1o/
sumber
return { FirstName: '' };
atau mengembalikan objek yang berisi metode yang berinteraksi dengan objek, bukankah lebih disukai untuk mengembalikan turunan kelas (function
) sehingga ketika Anda menggunakan objek Anda, objek memiliki tipe tertentu dan tidak hanya Sebuah Objek{}" ?newValue !== oldValue
pemeriksaan karena Angular tidak menjalankan fungsi jika oldValue dan newValue sama. Satu-satunya pengecualian untuk ini adalah jika Anda peduli dengan nilai awal. Lihat: docs.angularjs.org/api/ng/type/$rootScope.Scope#$watchSaya lebih suka tidak menggunakan
$watch
untuk ini. Alih-alih menugaskan seluruh layanan ke ruang lingkup pengontrol Anda dapat menetapkan hanya data.JS:
HTML:
Atau Anda dapat memperbarui data layanan dengan metode langsung.
JS:
sumber
Ada banyak cara Anda dapat berbagi data antara pengontrol
Penjelasan dari masing-masing metode:
Saya tidak akan menjelaskan seperti yang sudah dijelaskan oleh seseorang
menggunakan
$state.go
$stateparam
bekerja dengan cara yang mirip dengan$state.go
, Anda meneruskannya sebagai objek dari pengontrol pengirim dan mengumpulkan di pengontrol penerima menggunakan stateparammenggunakan
$rootscope
(a) mengirim data dari pengontrol anak ke induk
(B) mengirim data dari induk ke pengendali anak
sumber
Saya telah membuat pabrik yang mengontrol ruang lingkup bersama antara pola jalur rute, sehingga Anda dapat mempertahankan data yang dibagikan tepat 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
$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams){ ... })
jika Anda memiliki ui.routerAda beberapa cara untuk berbagi data antara pengontrol
Seperti yang kita tahu
$rootscope
bukanlah cara yang lebih disukai untuk transfer data atau komunikasi karena ini adalah ruang lingkup global yang tersedia untuk seluruh aplikasiUntuk berbagi data antara pengontrol Angular Js Layanan Angular adalah praktik terbaik, misalnya.
.factory
,.service
Untuk referensi
Dalam hal transfer data dari induk ke pengendali anak, Anda dapat langsung mengakses data induk dalam pengendali anak
$scope
Jika Anda menggunakan
ui-router
maka Anda dapat menggunakan$stateParmas
untuk melewati parameter url sepertiid
,name
,key
, dll$broadcast
juga cara yang baik untuk mentransfer data antara pengontrol dari orangtua ke anak dan$emit
untuk mentransfer data dari pengontrol anak ke orang tuaHTML
JS
Lihat tautan yang diberikan untuk tahu lebih banyak tentang
$broadcast
sumber
Solusi paling sederhana:
Saya telah menggunakan layanan AngularJS .
Langkah1: Saya telah membuat layanan AngularJS bernama SharedDataService.
Langkah2: Buat dua pengontrol dan gunakan layanan yang dibuat di atas.
Langkah 3: Cukup gunakan pengontrol yang dibuat dalam tampilan.
Untuk melihat solusi yang berfungsi untuk masalah ini, silakan tekan tautan di bawah ini
https://codepen.io/wins/pen/bmoYLr
file .html:
sumber
FirstCtrl
Apakah orang tua dan mendapat janji bahwaSecondCtrl
(anak) juga perlu? Saya tidak ingin melakukan dua panggilan api. Terima kasih.Ada cara lain tanpa menggunakan $ watch, menggunakan angular.copy:
sumber
Ada beberapa cara untuk melakukan ini.
Acara - sudah dijelaskan dengan baik.
router ui - dijelaskan di atas.
*
*
sumber
Tidak yakin di mana saya mengambil pola ini tetapi untuk berbagi data di seluruh pengontrol dan mengurangi $ rootScope dan $ scope ini berfungsi dengan baik. Ini mengingatkan pada replikasi data di mana Anda memiliki penerbit dan pelanggan. Semoga ini bisa membantu.
Layanan:
Pengontrol yang mendapatkan data baru, yaitu Penerbit akan melakukan sesuatu seperti ini ..
Pengontrol yang juga menggunakan data baru ini, yang disebut Pelanggan akan melakukan sesuatu seperti ini ...
Ini akan berfungsi untuk skenario apa pun. Jadi ketika pengendali utama diinisialisasi dan mendapat data itu akan memanggil metode changeData yang kemudian akan menyiarkan itu ke semua pelanggan data itu. Ini mengurangi kopling pengontrol kami satu sama lain.
sumber
sharedDataEventHub.changeData(newData)
sharedDataEventHub.changeData(newData)
anak atau pengendali yang bergantung pada data tersebut yang akan memiliki suatu tempat di tubuh controller mereka sebagai berikut:sharedDataEventHub.onChangeData($scope, function(obj) { vm.myObject = obj.data; });
Jika Anda menggunakan UI -Router ini bisa disuntikkan dari konfigurasi negara.Lakukan saja secara sederhana (diuji dengan v1.3.15):
sumber
dummy
bersifat global untuk kedua pengendali daripada dibagi dengan cara yang lebih modular melalui pewarisan dengan $ scope atau controllerAs atau menggunakan layanan.