Angular.js: 在 $onChanges 生命周期钩子中检测 UNINITIALIZED_VALUE

创建于 2016-07-15  ·  5评论  ·  资料来源: angular/angular.js

使用范围观察器,您可以通过检查新旧值是否相同来检测观察器是否是第一次运行:

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

但是,使用 Angular 1.5 $onChanges生命周期钩子,占位符对象 UNINITIALIZED_VALUE 是 previousValue。 但是,没有简单的方法来检查它。 您可以通过检查构造函数的名称来实现:

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内的每个 _ object _ 上。 所以,在这种情况下,它应该是changesObj.fieldInfo.isFirstChange()

此页面是否有帮助?
0 / 5 - 0 等级