2

私はAngularJSに基づいたWebページに取り組んでおり、パスを変更する必要がある場合があります(必要に応じてシバン)。問題は、時々動作することですが、Webブラウザを新しいパスに切り替えるために呼び出した後に呼び出す$location.path("/my_path_here")必要がある場合があります。$scope.$apply()$location.path

なぜこうなった?

編集:

http://pastebin.com/d1SjfCHd

4

1 に答える 1

6

この質問と Misko の回答を見てください: How does data binding work in AngularJS?

その答えは、プロセスを技術的に詳細に説明しています。というわけで、素人目線で語ります。

AngularJS はダーティ チェックを使用して機能します。Angular が監視している値のセットがあります。何か大きなことが起こるたびに (クリック、コントローラーでの関数呼び出し)、angular はdigestサイクルを実行し、監視された値を比較して、変更があるかどうかを確認します。変更がある場合、ウォッチャーに応じて、angular は必要なアクション (ビューの更新、コールバックの起動、ルートの更新) を実行します。

デフォルトのディレクティブを使用し、コントローラーで jquery イベント処理を使用しない場合は問題ありません。ただし、そうする場合は、Angular のダイジェスト サイクルにないことを知っておく必要があります。つまり、ウォッチャーは adigestが発生するまで起動しません。

監視されている変数をいつ更新するかを知る必要があります。ほとんどの場合、カスタム DOM イベント (または jquery イベント) です。その場合、angular に何かが変更されたことを知らせる必要があり、何が起こったのかを再確認する必要があります (つまり、ウォッチャーを更新します)。

これは、何かを変更しscope.$apply() た後に行うことです。

$apply()angular のダイジェスト サイクルに既に入っている場合は、実行できないことに注意してください。のようなエラーがスローされます$digest already in progress.

于 2013-09-04T10:26:18.987 に答える