2012-12-15 15 views
12

Poniższa funkcja definiuje zmienną w korzeniec.nie można uzyskać dostępu do korzeniac var w zakresie dyrektywy

function MyCtrl($scope, $rootScope) { 
    $rootScope.buttons = [{href: '#/students', icon:'icon-ok'}, 
         {href: '#/students', icon:'icon-remove'}, 
         {href: '#/students/new', icon:'icon-plus'}]; 
} 
MyCtrl.$inject = ['$scope', '$rootScope']; 

HTML w dyrektywie poniżej zależy od zmiennej w rootscope -

angular.module('btnbar.directive', []). 
directive("btnBar", function(){ 
    return { 
    restrict: 'E', 
    scope :{}, 
    controller: function($scope, $element,$rootScope) { 
    }, 
    template:'<div class="btn-toolbar">' + 
     '<a class="btn" ng-repeat="b in buttons" href={{b.href}}>' + 
     '<i class={{b.icon}}></i></a></div>', 
    replace:true 
    } 
}); 

Jednakże powyższy kod pracy robi. Działa, jeśli bezpośrednio zdefiniuję zmienną "guziki" w zakresie dyrektywy.

Odpowiedz

21

masz izolować w zakres dyrektywy

scope:{} 

Oznacza to, że dyrektywa nie ma dostępu do górnych zakresów - pamiętaj, że izolowanie zakresy nie prototypowo dziedziczyć z zakresu nadrzędnego. Tak więc albo usuń zakres izolatu, albo powiedz dyrekcji, aby powiązała niektóre właściwości z jego zasięgiem lokalnym z zakresu nadrzędnego.

scope: {buttons: '='} 

Następnie powołać dyrektywę jak ten

<btn-bar buttons="buttons"></btn-bar> 

Przykład: http://plnkr.co/edit/88R66L7uAHoezDZvuoH5?p=preview


Ponadto, zamiast modyfikowania $rootScope z kontrolera, można to zrobić z run metoda

var app = angular.module('app', ['btnbar.directive']); 

app.run(function($rootScope){ 
    $rootScope.buttons = [{href: '#/students', icon:'icon-ok'}, 
         {href: '#/students', icon:'icon-remove'}, 
         {href: '#/students/new', icon:'icon-plus'}]; 
}); 
+1

Jim dzięki za wielki post. Jedno pytanie, dlaczego muszę określić przyciski = "przyciski" w moim atrybucie. Co też robi? Dlaczego kod nie działa bez powyższej deklaracji atrybutu? – murtaza52

+0

, ponieważ kontroler dyrektywy akceptuje zakres, element, atrybut i transclude, trzeci parametr to $ rootScope, który jest faktycznie parametrem atrybutu. tutaj jest kod kontrolera ur: funkcja ($ scope, $ element, $ rootScope). Teraz zobacz dokumentację http://docs.angularjs.org/guide/directive – AsadYarKhan

+0

@AsadYarKhan Myślę, że mylisz kontroler z linkiem i kompilujesz. – Usagi

19

Spróbuj:

<a class="btn" ng-repeat="b in $root.buttons" href={{b.href}}>

+0

Ta odpowiedź ma więcej sensu, biorąc pod uwagę tytuł pytania –

Powiązane problemy