使用范围观察器,您可以通过检查新旧值是否相同来检测观察器是否是第一次运行:
$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
)以进行比较,尽管可能还有其他解决方案。
谢谢!!
每个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()
。
最有用的评论
每个
change
对象(包含在changes
对象中)都有一个用于此目的的isFirstChange()
方法。