2012-12-15 11 views
12

La funzione seguente definisce una variabile nel rootcope.impossibile accedere a rootcope var nello scope direttiva

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']; 

il codice HTML nella direttiva sotto dipende da una variabile nella 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 
    } 
}); 

Tuttavia quanto sopra lavoro codice di doesnt. Funziona se definisco direttamente la variabile 'buttons' nell'ambito della direttiva.

risposta

21

si dispone di un isolare di validità del direttiva

scope:{} 

Ciò significa che la direttiva non ha accesso a scopi superiori - ricordate che isolare gli ambiti non lo fanno prototipicamente erediterà dal campo di applicazione genitore. Quindi si rimuove l'ambito isolato o si dice alla direttiva di associare alcune proprietà al suo ambito locale dall'ambito principale.

scope: {buttons: '='} 

quindi richiamare la direttiva come questa

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

Esempio: http://plnkr.co/edit/88R66L7uAHoezDZvuoH5?p=preview


Inoltre, piuttosto che modificare la $rootScope da un controller, si potrebbe desiderare di farlo dal run metodo

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 grazie per la grande risposta. Una domanda perché ho bisogno di specificare i pulsanti = "pulsanti" nel mio attributo. Inoltre cosa fa? Perché il codice non funziona senza la suddetta dichiarazione di attributo? – murtaza52

+0

perché il controllore di direttiva accetta scope, element, attribute e transclude, il terzo parametro ur è $ rootScope che in realtà è il parametro dell'attributo. ecco il codice del controller: function ($ scope, $ element, $ rootScope). Ora consulta la documentazione http://docs.angularjs.org/guide/directive – AsadYarKhan

+0

@AsadYarKhan Penso che tu sia un controllore confuso con link e compilazione. – Usagi

19

Prova:

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

+0

Questa risposta ha più senso considerando il titolo della domanda –

Problemi correlati