185

カスタムディレクティブのスコープ外で発生するクリックイベントがあるため、「ng-click」属性を使用する代わりに、jQuery.click()リスナーを使用して、スコープ内で次のように関数を呼び出しています。

$('html').click(function(e) {
  scope.close();
);

close()は、次のような単純な関数です。

scope.close = function() {
  scope.isOpen = false;
}

私の見解では、「ng-show」がisOpenにバインドされた要素が次のようになっています。

<div ng-show="isOpen">My Div</div>

デバッグ中に、close()が呼び出され、isOpenがfalseに更新されているのに、AngularJSビューが更新されていないことがわかりました。ビューを更新するようにAngularに手動で指示する方法はありますか?それとも、私が見ていないこの問題を解決するためのより「角度のある」アプローチはありますか?

4

4 に答える 4

335

解決策は電話することでした...

$scope.$apply();

...私のjQueryイベントコールバックで。

于 2012-09-06T17:09:55.387 に答える
39

なぜ$apply呼ばれるべきですか?

TL; DR: Angularの世界以外$applyで行われた変更を適用する場合は常に呼び出す必要があります。


@Dustinの回答を更新するために、 $applyが正確に何をするのかと なぜそれが機能するのかを説明します。

$apply()AngularJSフレームワークの外部からAngularJSで式を実行するために使用されます。(たとえば、ブラウザーのDOMイベント、setTimeout、XHR、またはサードパーティのライブラリから)。AngularJSフレームワークを呼び出しているため、 例外処理の適切なスコープライフサイクルを実行し、ウォッチを実行する必要があります。

Angularでは、任意の値をバインディングターゲットとして使用できます。次に、JavaScriptコードターンの最後に、値が変更されたかどうかを確認します。バインディング値が変更されているかどうかを確認するステップには、実際にはメソッド$scope.$digest()1があります。$scope.$apply()代わりに(を呼び出す)を使用するため、直接呼び出すことはほとんどありません$scope.$digest

Angularは、式で使用される変数と$watch、スコープ内のリビング内のすべてのもののみを監視します。したがって、Angularコンテキストの外部でモデルを変更する場合は$scope.$apply()、それらの変更を伝播するように呼び出す必要があります。そうしないと、Angularはそれらが変更されたことを認識しないため、バインディングは更新されません2

于 2017-04-24T14:58:12.240 に答える
17

使用する

$route.reload();

コントローラに注入$routeすることを忘れないでください。

于 2016-09-19T09:35:38.533 に答える
1

以下は私のために働いたが:

$scope.$apply();

それは、より多くのセットアップと両方の使用を必要.$on.$broadcastしました$.watch

ただし、以下は必要なコードがはるかに少なく、魅力のように機能しました。

$timeout(function() {});

スコープ変数に更新の直後にタイムアウトを追加することで、AngularJSは更新があったことを認識し、それを単独で適用することができました。

于 2022-01-04T18:23:20.550 に答える