Angular子范围从祖先更新但不更新祖先

时间:2016-03-08 14:51:42

标签: javascript angularjs

我想知道是否有办法让子范围更改(启动$ apply)导致$ rootScope。$ digest($ apply方法的一部分)。 执行此操作时,我仍然希望在另一个祖先范围启动$ apply(调用$ rootScope。$ digest())时更新此范围。 而且当这个范围调用$ apply时,它仍然会更新它的子范围。

例如: 父亲 - 儿子 ----孙子

父亲,ng-click - >更新父亲,儿子,孙子 儿子,ng-click - >更新儿子,孙子 孙子,ng-click - >更新父亲,儿子,孙子甚至更新Son,Grandson

我设法通过角度源代码的微小改动(大约3行代码)来做到这一点。

由于它不会成为角色官方版本的一部分(除非我做拉动请求并将合并),我想知道是否已经有一种方法可以实现这一点。

提前致谢!

1 个答案:

答案 0 :(得分:1)

此实现正确继承:

//app.js
var app = angular.module('app', []);

app.run(function($rootScope){
  $rootScope.info = {data: 1};
});

app.directive('page', function(){
  return {
    restrict: 'E',
    replace: true,
    transclude: true,
    scope: true,
    template: '<div class="page" >Component "{{name}}":<pre ng-click="update()">{{info | json }}</pre><div ng-transclude></div></div>',
    controller: function($scope) {
      this.name = function(){
        return $scope.name;    
      };
      this.data = function() {
        return $scope.info.data;  
      } 
      $scope.update = function() {
        $scope.info.data = $scope.info.data + 1  
      }
      $scope.info = {data: 0};
    },  
    link: function($scope, element, attrs) {
      var parent = element.parent().inheritedData('$pageController');
      console.log(element.parent(), parent); 
      $scope.name = attrs.name || '???';
      $scope.$watch(function(){
        return parent && parent.data();  
      },function(a,b){
        if(a !== void 0 && a !== b) {
          $scope.info.data = a;
        }
      })
    }
  }; 
});

//index.html
<body ng-app="app">
  <h1>Test</h1>
  <page name='GrandFather'>
    <page name='Father'>
      <page name='Son'>
      </page>
    </page>
  </page>
</body>

[增订] http://plnkr.co/edit/ywZw3J7pL1GQPZiRnkol?p=preview