Angular.js: اكتشاف UNINITIALIZED_VALUE في خطاف دورة حياة $ onChanges

تم إنشاؤها على ١٥ يوليو ٢٠١٦  ·  5تعليقات  ·  مصدر: angular/angular.js

باستخدام مراقب النطاق ، يمكنك اكتشاف ما إذا كانت هذه هي المرة الأولى التي يتم فيها تشغيل المراقب عن طريق التحقق مما إذا كانت القيم الجديدة والقديمة متطابقة:

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

ومع ذلك ، باستخدام خطاف دورة الحياة Angular 1.5 $onChanges ، يكون كائن العنصر النائب UNINITIALIZED_VALUE هو القيمة السابقة. ومع ذلك ، لا توجد طريقة سهلة للتحقق من ذلك. يمكنك القيام بذلك عن طريق التحقق من اسم المُنشئ:

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

ولكن هذا يبدو وكأنه نوع من الاختراق.

أفضل حل يمكنني التفكير فيه هو أن يتم تخزين عنصر UNINITIALIZED_VALUE باعتباره ثابتًا (للقراءة فقط) في مكان ما (على سبيل المثال angular.UNINITIALIZED_VALUE ) للمقارنة به ، على الرغم من احتمال وجود حلول أخرى أيضًا.

شكرا!!

works as expected

التعليق الأكثر فائدة

كل كائن change (مضمن في الكائن changes ) له طريقة isFirstChange() لهذا الغرض بالضبط.

ال 5 كومينتر

كل كائن change (مضمن في الكائن changes ) له طريقة isFirstChange() لهذا الغرض بالضبط.

لقد استخدمت الكود التالي لأن isFirstChange() غير متوفر في كائن التغييرات:

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

saurajit لا يبدو أنها موجودة (على سبيل المثال ، في وحدة تحكم أدوات التطوير ، يبدو أنها مفقودة عند التمرير فوق كائن change.expr) ولكن هذه الوظيفة مخفية في النموذج الأولي للكائن. حاول تنفيذ changes.expr.isFirstChange() (أو في مثالك changesObj.fieldInfo.isFirstChange() ).

لقد استخدمت الكود التالي لأن isFirstChange() غير متوفر في كائن التغييرات:

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

آسف ولكن هذا لن يعمل مع حزمة مصغرة.

كما هو مذكور في https://github.com/angular/angular.js/issues/14917#issuecomment -232971141 ، فإن طريقة isFirstChange() موجودة على كل _ كائن _ داخل changes . لذلك ، في هذه الحالة ، يجب أن يكون changesObj.fieldInfo.isFirstChange() .

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات