Angular.js: Mendeteksi UNINITIALIZED_VALUE di kait siklus hidup $onChanges

Dibuat pada 15 Jul 2016  ·  5Komentar  ·  Sumber: angular/angular.js

Dengan pengamat lingkup, Anda dapat mendeteksi apakah ini pertama kalinya pengamat berjalan dengan memeriksa apakah nilai baru dan lama sama:

$scope.$watch('expr', function (newValue, oldValue) {
    if (newValue === oldValue) {
        // first time running
    }
});

Namun, dengan kait siklus hidup Angular 1.5 $onChanges , objek placeholder UNINITIALIZED_VALUE adalah nilai sebelumnya. Namun, tidak ada cara mudah untuk memeriksanya. Anda dapat melakukannya dengan memeriksa nama konstruktor:

ExampleController.prototype.$onChanges = function (changes) {
    if (changes.expr.previousValue.constructor.name === 'UNINITIALIZED_VALUE') {
        // first time running
    }
};

tapi itu sepertinya sedikit peretasan.

Solusi terbaik yang dapat saya pikirkan adalah memiliki objek UNINITIALIZED_VALUE harus disimpan sebagai konstanta (hanya-baca) di suatu tempat (misalnya angular.UNINITIALIZED_VALUE ) untuk dibandingkan, meskipun mungkin ada solusi lain juga.

Terima kasih!!

works as expected

Komentar yang paling membantu

Setiap objek change (yang terdapat dalam objek changes ) memiliki metode isFirstChange() untuk tujuan yang tepat ini.

Semua 5 komentar

Setiap objek change (yang terdapat dalam objek changes ) memiliki metode isFirstChange() untuk tujuan yang tepat ini.

Saya menggunakan kode berikut karena isFirstChange() tidak tersedia di objek perubahan:

ctrl.$onChanges = function (changesObj) { if (changesObj.fieldInfo.previousValue.constructor.name === 'UNINITIALIZED_VALUE') { init(); } };

@saurajit sepertinya tidak ada di sana (mis. di konsol alat Dev, tampaknya hilang saat melayang di objek change.expr) tetapi fungsi itu disembunyikan di prototipe objek. Coba jalankan changes.expr.isFirstChange() (atau dalam contoh Anda changesObj.fieldInfo.isFirstChange() ).

Saya menggunakan kode berikut karena isFirstChange() tidak tersedia di objek perubahan:

ctrl.$onChanges = function (changesObj) { if (changesObj.fieldInfo.previousValue.constructor.name === 'UNINITIALIZED_VALUE') { init(); } };

Maaf, tetapi ini tidak akan berfungsi dengan bundel yang diperkecil.

Seperti yang disebutkan dalam https://github.com/angular/angular.js/issues/14917#issuecomment -232971141, metode isFirstChange() ada di setiap _ objek _ di dalam changes . Jadi, dalam hal ini, seharusnya changesObj.fieldInfo.isFirstChange() .

Apakah halaman ini membantu?
0 / 5 - 0 peringkat