3

AngularJS では、モデルがダーティになり、サーバーに保存する必要があることをどのようにトリガーすればよいですか? ユーザーが「保存」ボタンをクリックする以外に?

$watch を使用することを考えましたが、データが最初にロードされたときに起動するため、至る所でこのハックが発生します。

AngularJS でモデルの変更を監視するときに初期ロードを無視するにはどうすればよいですか?

$emit イベントで保存をトリガーすることもできますが、次の場合:

  1. スコープにプロパティを設定する
  2. $そのスコープでイベントを発行する
  3. 親コントローラーで $on を使用してイベントをキャッチし、プロパティを確認します

この順序で、手順 3 で宣言されたイベント ハンドラーは、手順 1 で変更が行われる前のスコープ プロパティを認識します。

ここに例をまとめました:

http://plnkr.co/edit/Il9TzUdCSBdewCxIKARZ

ここで、foo、bar、foo、bar の順にクリックすると、イベント リスナーが常にプロパティの 1 ステップ後ろにあることがわかります。

これは、スコープ イベントがダイジェスト サイクルに関連して処理されるときに何か関係があると思いますが、javascript の法則に違反しているようです。Angular の連中はどのようにして、プロパティを変更してもプロパティが変更されないようにすることができたのでしょうか!?

これにより、常に古いデータを保存していたときに頭をかきむしりました。

簡単な修正は、 $timeout を使用して保存を「延期」することです。これは、ダイジェスト サイクルが終了するまでだと思います。これは機能しますが、面倒なようです。何が起きてる?スコープへの変更がイベント ハンドラーに表示されない場合、イベントは役に立たないように見えますね。

これを行うクリーンな方法はありますか?

ありがとう。

4

1 に答える 1

1

$digestこれは、 の後に発生するループまで双方向バインディングが更新されないため$emitです。

$watchデータに a を使用して保存をトリガーすることをお勧めします。

// Controller
$scope.$watch('message', function(newVal, oldVal) {
  if (newVal === oldVal) {
    return;
  }
  // Handle update...
});

もう 1 つのオプションは、文字列の代わりにオブジェクトをディレクティブに渡すことです。これにより、$onリスナーは正しいデータにアクセスできるようになります。

例えば:

// Controller
$scope.messageData = {message: "Initial message"};

// HTML
<div set-message="messageData">...</div>

// Directive
scope: {
  messageData: "=setMessage"
},
link: function(scope) {
  scope.setMessage = function(message) {
    scope.messageData.message = message;
    scope.$emit('messagechange');
  };
}
于 2013-07-05T13:51:09.433 に答える