bugfix> angularjs > 投稿

次のようなAngularJSコントローラーがあるとしましょう:

var module = angular.module('myApp', []);
module.controller('TimeCtrl', function($scope, $interval) {
  var tick = function() {
    $scope.clock = Date.now();
    window.scope = $scope;
  }
  tick();
  $interval(tick, 1000);
});

  1. $scope.clock の変更DOMに自動的に反映されます。 ただし、コンソールで行う場合は、明示的に行う必要があります $scope.apply 。なぜそうですか? $interval です魔法をかけている?
  2. 一般的に、私は $scope.watch する必要はありませんこれらの変数? $scope.watch の目的を考えたこれでした。
回答 2 件
  • 1。

    $interval(f, time)
    
    

    多かれ少なかれ

    setInterval(function() {
       f();
       $rootScope.$apply();
    }, time)
    
    

    2。

    <div>{{test}}</div>

    多かれ少なかれ

    $scope.$watch('test', function(value) {
      divElement.innerHTML = value;
    })
    
    

  • Why is it so? Is $interval  魔法をかけている?

    はい、そうです。これは、AngularJSダイジェストサイクルを自動的にトリガーします。これは、 $scope.$apply() を使用して「手動で」行うことです。  (これもトリガーします)。これにより、変更がDOMに反映されます。ダイジェストサイクルがトリガーされない場合、AngularJSは「モデルに変更が加えられたことを認識しないため、DOMを更新しません」。

    (...) don't I need to watch these variables?

    いいえ、これらの変数のいずれかが値を変更したときに通知を受ける必要がない限り。 AngularJSスコープ内ですべての変更を行う限り、DOMは常に「通知」(更新)されます。

    AngularJSスコープ内で処理を行っていることを知る方法は?

    通常、 $interval などのサービスによって提供される機能を使用する場合  および $timeout 、元の( setInterval のラッパーであるため、スコープ内で処理を行っています。  および setTimeout )そして、前述のダイジェストサイクルを自動的にトリガーし、モデルとDOMの間で物事を同期させます。

    そう、最後に

    Why do we need $scope.apply()  コンソールから変更を行うが、変更はしない場合   さもないと?

    コンソールから、AngularJSの範囲外でいくつかの変更を行っており、前述のダイジェストサイクルを自分でトリガーする必要があるためです。

あなたの答え