Angularjs watch for change in parent scope

前端 未结 5 1718
甜味超标
甜味超标 2020-12-24 05:32

I\'m writing a directive and I need to watch the parent scope for a change. Not sure if I\'m doing this the preferred way, but its not working with the following code:

5条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-24 05:44

    I would suggest you to use the $broadcast between controller to perform this, which seems to be more the angular way of communication between parent/child controllers

    The concept is simple, you watch the value in the parent controller, then, when a modification occurs, you can broadcast it and catch it in the child controller

    Here's a fiddle demonstrating it : http://jsfiddle.net/DotDotDot/f733J/

    The part in the parent controller looks like that :

    $scope.$watch('overlaytype', function(newVal, oldVal){
        if(newVal!=oldVal)
            $scope.$broadcast('overlaychange',{"val":newVal})
    });
    

    and in the child controller :

    $scope.$on('overlaychange', function(event, args){
        console.log("change detected")
        //any other action can be perfomed here
    });
    

    Good point with this solution, if you want to watch the modification in another child controller, you can just catch the same event

    Have fun

    Edit : I didn't see you last edit, but my solution works also for the directive, I updated the previous fiddle ( http://jsfiddle.net/DotDotDot/f733J/1/ )

    I modified your directive to force it to create a child scope and create a controller :

    directive('center',function($window){
      return {
        restrict : "A",
        scope:true,
        controller:function($scope){
            $scope.overlayChanged={"isChanged":"No","value":""};
            $scope.$on('overlaychange', function(event, args){
            console.log("change detected")
            //whatever you need to do
    
        });
      },
    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");
      };
      angular.element($window).bind('resize',function(e){
        console.log(scope.$parent.data.overlaytype)
        resize();
          });
        }
      };
    });
    

提交回复
热议问题