スコープウォッチャーでは、新しい値と古い値が同じであるかどうかを確認することで、ウォッチャーが初めて実行されているかどうかを検出できます。
$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そこにあるようには見えませんが(たとえば、Devツールコンソールでは、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()
ます。
最も参考になるコメント
各
change
オブジェクト(changes
オブジェクトに含まれる)には、isFirstChange()
この目的のために