45

ディレクティブを作成していて、親スコープの変更を監視する必要があります。これが好ましい方法であるかどうかはわかりませんが、次のコードでは機能しません。

  scope.$watch(scope.$parent.data.overlaytype,function() {
    console.log("Change Detected...");
  })

これはウィンドウの読み込み時にログオンしましたが、overlaytype が変更された場合でも、二度とログオンしませんでした。

変更を監視するにはどうすればよいoverlaytypeですか?

編集: ここにディレクティブ全体があります。子スコープを取得する理由が完全にはわかりません

/* Center overlays vertically directive */
aw.directive('center',function($window){
  return {
    restrict : "A",
    link : function(scope,elem,attrs){

      var resize = function() {
        var winHeight = $window.innerHeight - 90,
            overlayHeight = elem[0].offsetHeight,
            diff = (winHeight - overlayHeight) / 2;
            elem.css('top',diff+"px");
      };

      var watchForChange = function() {
        return scope.$parent.data.overlaytype;
      }
      scope.$watch(watchForChange,function() {
        $window.setTimeout(function() {
          resize();
        }, 1);
      })

      angular.element($window).bind('resize',function(e){
        console.log(scope.$parent.data.overlaytype)
        resize();
      });
    }
  };
});
4

5 に答える 5

76

親スコープのプロパティを監視したい場合は、親スコープ$watchのメソッドを使用できます。

//intead of $scope.$watch(...)
$scope.$parent.$watch('property', function(value){/* ... */});

EDIT 2016: 上記は問題なく動作するはずですが、実際にはきれいなデザインではありません。代わりにディレクティブまたはコンポーネントを使用して、その依存関係をバインディングとして宣言してください。これにより、パフォーマンスが向上し、デザインがすっきりします。

于 2014-03-31T12:47:50.400 に答える
7

子スコープにdataプロパティが必要です。スコープは、親スコープと子スコープの間でプロトタイプの継承を使用します。

また、$watchメソッドが期待する最初の引数は、変数からの値ではなく、評価する式または関数です。したがって、代わりにそれを送信する必要があります。

于 2013-07-24T15:47:13.020 に答える
7

true子スコープ内の親スコープ変数を監視する場合は、に 2 番目の引数として追加できます$watch。これにより、オブジェクトが変更されるたびにウォッチがトリガーされます

$scope.$watch("searchContext", function (ctx) {
                ...
            }, true);
于 2015-08-26T08:44:15.817 に答える