1. ホーム
  2. angularjs

[解決済み] AngularJSでモデルチェンジを見るとき、最初のロードを無視するにはどうすればいいですか?

2022-04-15 01:08:40

質問

私は、$scope.fieldcontainerプロパティにディープグラフとして配置されている、単一のエンティティのエディタとして機能するWebページを持っています。REST APIから($resource経由で)レスポンスを取得した後、'fieldcontainer'にウォッチを追加しています。このウォッチを使用して、ページ/エンティティが "dirty"であるかどうかを検出しているのです。今は保存ボタンをバウンスさせていますが、本当はユーザーがモデルを汚すまで保存ボタンを見えないようにしたいのです。

これは、ウォッチを作成した直後に .fieldcontainer = ... の割り当てが行われたためだと思われます。私は最初の誤報を吸収するために "dirtyCount" プロパティを使用することを考えていましたが、それは非常にハッキングのように感じます... そして私はこれを扱うための "Angular idiomatic" 方法があるはずだと考えました - ダーティモデルを検出するために時計を使用しているのは私だけではないはずです。

以下は、私がウォッチを設定したコードです。

 $scope.fieldcontainer = Message.get({id: $scope.entityId },
            function(message,headers) {
                $scope.$watch('fieldcontainer',
                    function() {
                        console.log("model is dirty.");
                        if ($scope.visibility.saveButton) {
                            $('#saveMessageButtonRow').effect("bounce", { times:5, direction: 'right' }, 300);
                        }
                    }, true);
            });

UIダーティーングを行うコードをquot;if (dirtyCount >0)" でガードするよりも、もっときれいな方法があるはずだと思い続けています......。

解決方法は?

初期ロードの直前にフラグを設定する。

var initializing = true

そして、最初の $watch が起動したら、次のようにします。

$scope.$watch('fieldcontainer', function() {
  if (initializing) {
    $timeout(function() { initializing = false; });
  } else {
    // do whatever you were going to do
  }
});

このフラグは、現在のダイジェストサイクルが終了した時点で破棄されるため、次の変更がブロックされることはありません。