2014-05-11 20 views
74

Yalıtkanın kapsamı ile, yönerge şablonu denetleyiciye ('Ctrl') $ rootScope değişkenine erişemiyor gibi görünmektedir, ancak direktifin denetleyicisinde görünmektedir. Denetleyici ('Ctrl') $ kapsam değişkeninin neden yalıtımda görünmediğini anlıyorum.

HTML:

<div ng-app="app"> 
    <div ng-controller="Ctrl"> 
     <my-template></my-template> 
    </div> 

    <script type="text/ng-template" id="my-template.html"> 
     <label ng-click="test(blah)">Click</label> 
    </script> 
</div> 

JavaScript:

angular.module('app', []) 
    .controller('Ctrl', function Ctrl1($scope, $rootScope) { 
     $rootScope.blah = 'Hello'; 
     $scope.yah = 'World' 
    }) 
    .directive('myTemplate', function() { 
     return { 
      restrict: 'E', 
      templateUrl: 'my-template.html', 
      scope: {}, 
      controller: ["$scope", "$rootScope", function($scope, $rootScope) { 
       console.log($rootScope.blah); 
       console.log($scope.yah);, 

       $scope.test = function(arg) { 
        console.log(arg); 
       } 
      }] 
     }; 
    }); 

JSFiddle

değişken bir izolat kapsamı ile erişilir - izolatı kapsamı hattı yorumlayarak görülebileceği gibi:

 // scope: {}, 
+0

nasıl gösteren bir fork of your Fiddle olduğunu yönerge içine $ rootScope enjekte etmeyi denediniz ... yönerge ('myTemplate', function ($ rootSc) ope) {...}) '? –

+0

@MarcKline Sadece bunu denedi ve şanssız. –

+0

http://stackoverflow.com/questions/13895124/unable-to-access-rootscope-var-in-directive-scope –

cevap

151

Sen $root.blah

Working Code

HTML kullanarak bu şekilde deneyebilirsiniz Çünkü

<label ng-click="test($root.blah)">Click</label> 

javascript

angular.module('app', []) 
    .controller('Ctrl', function Ctrl1($scope, $rootScope) { 
     $rootScope.blah = 'Hello'; 
     $scope.yah = 'World' 
    }) 
    .directive('myTemplate', function() { 
     return { 
      restrict: 'E', 
      templateUrl: 'my-template.html', 
      scope: {}, 
      controller: ["$scope", "$rootScope", function($scope, $rootScope) { 
       console.log($rootScope.blah); 
       console.log($scope.yah); 

       $scope.test = function(arg) { 
        console.log(arg); 
       } 
      }] 
     }; 
    }); 
+6

Bunu başarmak istediğim şeyi 'çözdüğüm' ('$ root' 'u bilmiyordum ya da bunun böyle kullanılabileceğini) olarak işaretliyorum. ** Ancak **, Mark Kline'ın cevabının genellikle en iyi çözüm olduğunu tavsiye ederim. –

+5

harika! $ rootScope'un $ root olarak görünümlere dönüştüğünü bilmek oldukça faydalı, çok teşekkürler! –

+0

Bu, rootScope –

20

1) denetleyiciniz Ctrl'de ve yönerge denetleyicide $scope izolatını ayırma, aynı kapsamı göstermez - diyelim, Ctrl'de kapsam1 ve yönerge içinde kapsam2.

2) için izole kapsamı scope2prototypicallly $rootScope devralamaz yapmak; $rootScope.blah'u tanımladığınızda kapsam2'da görmeniz mümkün değildir.

3) Ne sizin yönergesi şablonunda erişebileceği değerleri depolamak için $rootScope kullanmaktan kaçınmalısınız, bunu özetlemek durumunda scope2

, burada Genellikle miras şema

_______|______ 
    |   | 
    V   V 
$rootScope  scope2 
    | 
    V 
    scope1 


$rootScope.blah 
> "Hello" 
scope1.blah 
> "Hello" 
scope2.blah 
> undefined 
+1

'da tanımlanmış bir işleve erişmek için gereken şey olduğu için mükemmel bir şeydi. Oldukça yararlı ama nidhishkrishnan'ın bir çözümü rootScope değerlerini kullanmak gerekirse işe yarıyor. Güzel bir hack. –

+0

Peki, dediğiniz şey neden $ rootScope değişkenlerini html ($ root olmadan) olarak kullanamadığımı yanıtlamak için mantıktır, ancak $ kapsamlarını görmek için Batarang eklentisini kullandığımda açıkça görebiliyorum $ rootScope, tüm diğerlerinin ana kapsamıdır (direktiflerde yalıtılmış kapsam dahil). Ayrıca, açısal resmi belgelerin tanımı şöyle demiştir: "Her uygulamanın tek bir kök kapsamı vardır. Diğer tüm kapsamlar, kök kapsamının alt öğeleridir" (https://docs.angularjs.org/api/ng/service/$ rootScope) – IsraGab

31

olduğunu Kontrolörler ve direktifler arasında paylaşmanız gerekir. JS'de globals kullanmak gibi. Bunun yerine bir hizmet kullanın:

Bir sabit (veya ...kullanım) benzer:

.constant('blah', 'blah') 

https://docs.angularjs.org/api/ng/type/angular.Module

bir fabrika (veya hizmet veya sağlayıcı): Burada

.factory('BlahFactory', function() { 
    var blah = { 
     value: 'blah' 
    }; 

    blah.setValue = function(val) { 
     this.value = val; 
    }; 

    blah.getValue = function() { 
     return this.value; 
    }; 

    return blah; 
}) 

ekleyenler kullanmak ya

+3

+1 Bunun için çok teşekkür ederim ve başarmaya çalıştığım şey için ** doğru ** yönde bana işaret ettiğin için. Sanırım NidhishKrishnan'ın benim yorumumda belirtilen sebepten dolayı 'cevap' olarak kabul edilmesi gerekiyor. –

+1

+1, kullanılması zor olduğundan sabit kullanım durumu için. Ayrıca, $ rootScope kullanmama notu profesyonel bir ipucuydu. –

İlgili konular