Saya mengambil sedikit waktu untuk mencari tahu apa cara terbaik untuk melakukan ini. Saya juga ingin mempertahankan status, ketika pengguna meninggalkan halaman dan kemudian menekan tombol kembali, untuk kembali ke halaman lama; dan tidak hanya memasukkan semua data saya ke rootscope .
Hasil akhirnya adalah memiliki layanan untuk setiap pengontrol . Di controller, Anda hanya memiliki fungsi dan variabel yang tidak Anda pedulikan, jika mereka dihapus.
Layanan untuk pengontrol disuntikkan dengan injeksi ketergantungan. Karena layanan adalah lajang, data mereka tidak dimusnahkan seperti data di controller.
Dalam layanan, saya punya model. model HANYA memiliki data - tidak ada fungsi -. Dengan begitu bisa dikonversi bolak-balik dari JSON untuk bertahan. Saya menggunakan penyimpanan lokal HTML5 untuk kegigihan.
Terakhir saya menggunakan window.onbeforeunload
dan$rootScope.$broadcast('saveState');
memberi tahu semua layanan bahwa mereka harus menyelamatkan negara mereka, dan $rootScope.$broadcast('restoreState')
membiarkan mereka tahu untuk memulihkan keadaan mereka (digunakan ketika pengguna meninggalkan halaman dan menekan tombol kembali untuk kembali ke halaman masing-masing).
Contoh layanan bernama userService untuk userController saya :
app.factory('userService', ['$rootScope', function ($rootScope) {
var service = {
model: {
name: '',
email: ''
},
SaveState: function () {
sessionStorage.userService = angular.toJson(service.model);
},
RestoreState: function () {
service.model = angular.fromJson(sessionStorage.userService);
}
}
$rootScope.$on("savestate", service.SaveState);
$rootScope.$on("restorestate", service.RestoreState);
return service;
}]);
contoh userController
function userCtrl($scope, userService) {
$scope.user = userService;
}
Tampilan kemudian menggunakan penjilidan seperti ini
<h1>{{user.model.name}}</h1>
Dan di modul aplikasi , dalam menjalankan fungsi saya menangani penyiaran dari saveState dan restoreState
$rootScope.$on("$routeChangeStart", function (event, next, current) {
if (sessionStorage.restorestate == "true") {
$rootScope.$broadcast('restorestate'); //let everything know we need to restore state
sessionStorage.restorestate = false;
}
});
//let everthing know that we need to save state now.
window.onbeforeunload = function (event) {
$rootScope.$broadcast('savestate');
};
Seperti yang saya sebutkan ini butuh beberapa saat untuk sampai ke titik ini. Ini adalah cara yang sangat bersih untuk melakukannya, tetapi itu adalah sedikit rekayasa untuk melakukan sesuatu yang saya duga adalah masalah yang sangat umum ketika berkembang di Angular.
Saya ingin melihat lebih mudah, tetapi sebagai cara bersih untuk menangani menjaga status melintasi pengontrol, termasuk ketika pengguna pergi dan kembali ke halaman.
sessionStorage.restoreState
diatur"true"
. Untuk solusi yang benar untuk mempertahankan data saat halaman disegarkan, lihat di sini . Untuk data yang ada saat rute berubah, lihat jawaban carloscarcamo. Yang Anda butuhkan hanyalah memasukkan data ke dalam layanan.$scope.user = userService;
Anda memiliki sesuatu seperti ini:$scope.name = userService.model.name; $scope.email = userService.model.email;
. Apakah ini akan berfungsi atau mengubah variabel dalam pandangan tidak akan mengubahnya dalam Layanan?Agak terlambat untuk jawaban tetapi baru saja memperbarui biola dengan beberapa praktik terbaik
jsfiddle
sumber
updateService
harus dipanggil ketika controller dihancurkan -$scope.$on('$destroy', function() { console.log('Ctrl destroyed'); $scope.updateServiceName($scope.name); });
$ rootScope adalah variabel global besar, yang baik untuk hal-hal satu kali, atau aplikasi kecil. Gunakan layanan jika Anda ingin merangkum model dan / atau perilaku Anda (dan mungkin menggunakannya kembali di tempat lain). Selain posting grup OP Google yang disebutkan, lihat juga https://groups.google.com/d/topic/angular/eegk_lB6kVs/discussion .
sumber
Sudut tidak benar-benar memberikan apa yang Anda cari di luar kotak. Apa yang akan saya lakukan untuk mencapai apa yang Anda cari adalah menggunakan add-ons berikut
Router UI & UI Router Ekstra
Kedua hal ini akan memberi Anda perutean berbasis negara dan status lengket, Anda dapat menabrak antara status dan semua informasi akan disimpan sebagai ruang lingkup "tetap hidup" untuk berbicara.
Periksa dokumentasi pada keduanya karena cukup lurus ke depan, ui router tambahan juga memiliki demonstrasi yang bagus tentang cara kerja sticky state.
sumber
Saya punya masalah yang sama, Ini yang saya lakukan: Saya punya SPA dengan banyak tampilan di halaman yang sama (tanpa ajax), jadi ini adalah kode modul:
Saya hanya memiliki satu pengontrol untuk semua tampilan, tetapi, masalahnya sama dengan pertanyaan, pengontrol selalu menyegarkan data, untuk menghindari perilaku ini, saya melakukan apa yang orang sarankan di atas dan saya membuat layanan untuk tujuan itu, kemudian meneruskannya ke controller sebagai berikut:
Sekarang saya dapat memanggil fungsi pembaruan dari semua pandangan saya, memberikan nilai dan memperbarui model saya, saya tidak perlu menggunakan html5 apis untuk data ketekunan (ini dalam kasus saya, mungkin dalam kasus lain mungkin perlu menggunakan html5 apis seperti penyimpanan lokal dan barang lainnya).
sumber
Alternatif untuk layanan adalah menggunakan value store.
Di dasar aplikasi saya, saya menambahkan ini
Dan kemudian di controller saya, saya hanya referensi toko nilai. Saya tidak berpikir itu berlaku jika pengguna menutup browser.
sumber
Solusi yang akan bekerja untuk beberapa cakupan dan beberapa variabel dalam lingkup tersebut
Layanan ini didasarkan pada jawaban Anton, tetapi lebih dapat diperluas dan akan bekerja lintas beberapa lingkup dan memungkinkan pemilihan beberapa variabel lingkup dalam lingkup yang sama. Ini menggunakan jalur rute untuk mengindeks setiap lingkup, dan kemudian nama variabel lingkup untuk mengindeks satu tingkat lebih dalam.
Buat layanan dengan kode ini:
Tambahkan kode ini ke fungsi jalankan Anda di modul aplikasi Anda:
Suntikkan layanan restoreScope ke pengontrol Anda (contoh di bawah):
Contoh di atas akan menginisialisasi $ scope.user ke nilai yang disimpan, jika tidak maka akan default ke nilai yang disediakan dan menyimpannya. Jika halaman ditutup, disegarkan, atau rute diubah, nilai saat ini dari semua variabel lingkup terdaftar akan disimpan, dan akan dipulihkan pada saat rute / halaman dikunjungi berikutnya.
sumber
Anda dapat menggunakan
$locationChangeStart
acara untuk menyimpan nilai sebelumnya di$rootScope
atau dalam layanan. Ketika Anda kembali, cukup inisialisasi semua nilai yang disimpan sebelumnya. Berikut ini adalah demo cepat yang digunakan$rootScope
.sumber