Saya memiliki halaman web yang berfungsi sebagai editor untuk satu entitas, yang duduk sebagai grafik yang dalam di properti $ scope.fieldcontainer. Setelah saya mendapat tanggapan dari REST API saya (melalui $ resource), saya menambahkan arloji ke 'fieldcontainer'. Saya menggunakan arloji ini untuk mendeteksi apakah halaman / entitas "kotor". Saat ini saya sedang membuat tombol simpan memantul tetapi saya benar-benar ingin membuat tombol simpan tidak terlihat sampai pengguna memasukkan model.
Apa yang saya dapatkan adalah pemicu tunggal arloji, yang saya pikir sedang terjadi karena tugas .fieldcontainer = ... dilakukan segera setelah saya membuat arloji saya. Saya berpikir untuk hanya menggunakan properti "dirtyCount" untuk menyerap alarm palsu awal tapi itu terasa sangat berantakan ... dan saya pikir harus ada cara "Angular idiomatic" untuk menangani ini - saya bukan satu-satunya menggunakan arloji untuk mendeteksi model kotor.
Berikut kode tempat saya menyetel jam tangan:
$scope.fieldcontainer = Message.get({id: $scope.entityId },
function(message,headers) {
$scope.$watch('fieldcontainer',
function() {
console.log("model is dirty.");
if ($scope.visibility.saveButton) {
$('#saveMessageButtonRow').effect("bounce", { times:5, direction: 'right' }, 300);
}
}, true);
});
Saya hanya terus berpikir harus ada cara yang lebih bersih untuk melakukan ini daripada menjaga kode "UI dirtying" saya dengan "if (dirtyCount> 0)" ...
sumber
undefined
. Ini memiliki nilai default yang diperlukan jika pembaruan model saya tidak muncul dengan semua informasi. Jadi beberapa nilai tidak dapat berubah tetapi harus dipicu.Jawaban:
mengatur bendera sebelum memuat awal,
dan kemudian ketika $ watch pertama menyala, lakukan
Bendera akan dihancurkan tepat di akhir siklus intisari saat ini, jadi perubahan selanjutnya tidak akan diblokir.
sumber
Pertama kali pendengar dipanggil, nilai lama dan nilai baru akan identik. Jadi lakukan saja ini:
Ini sebenarnya cara yang direkomendasikan oleh dokumen Angular untuk menanganinya :
sumber
null
ke nilai awal yang dimuat, bukan untuk mengabaikan perubahan ketika tidak ada perubahan.null
.oldValue
akan menjadi nol pada go-around pertama.Saya menyadari pertanyaan ini telah dijawab, namun saya punya saran:
Menggunakan flags berfungsi tetapi memiliki sedikit bau kode untuk itu bukan?
sumber
return unless oldValue?
(? Adalah operator eksistensial di CS).Selama pemuatan awal dari nilai saat ini, bidang nilai lama tidak terdefinisi. Jadi contoh di bawah ini membantu Anda untuk mengecualikan pemuatan awal.
sumber
null
danundefined
akan cocok dalam situasi ini, atau ('1' == 1
dll)Hanya validasikan keadaan val baru:
sumber