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そこにあるようには見えませんが(たとえば、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()ます。

このページは役に立ちましたか?
0 / 5 - 0 評価