2016-03-08 87 views
2

我想知道是否有辦法讓子範圍更改(啓動$ apply)導致$ rootScope。$ digest($ apply方法的一部分) 。 當我這樣做時,我仍然希望當另一個祖先作用域啓動$ apply(它調用$ rootScope。$ digest())時這個作用域被更新。 而且當這個範圍調用$ apply時,它仍然會更新它的子範圍。從祖先更新但不更新祖先的角度子範圍

對於〔實施例: 父親 --Son ----孫子

父親,NG-點擊 - >更新父,子,孫 兒子,NG-點擊 - >更新的兒子,孫子 孫子,ng-click - >更新父親,兒子,孫子,甚至更新兒子,孫子

我設法做到這一點,在角度的源代碼(約3行代碼)略有改變。

由於它不會是角的官方版本的一部分(除非我會做拉請求,並將合併),我想知道是否已經有一種方法來實現這一點。

在此先感謝!

+0

你能創造出你的目標是什麼plunkr? '範圍可以被隔離或不... – malix

+0

我編輯了我的問題。讓我知道它是否沒有幫助。 –

+0

聽起來像你可以通過指令和一個&綁定來實現。 – Dave

回答

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

+0

它不會給我我想要的行爲。我想要的就像我所做的那種掠奪者的例子一樣:https://plnkr.co/edit/vveVnOKxP0BEd9F5sLsB?p=preview –

+0

我明白了!但你的孫子按鈕不只是更新自己... 此外,你不應該更新值或在$ watch()'的第一個功能有副作用,你會打破互聯網... – malix

+0

我更新爲適當繼承...接受? :) – malix