2013-02-11 13 views
13

Ho un regolatore di iscritti in questo modo:Come posso utilizzare un controller registrato nella mia direttiva angolare?

myModule.controller('MyController', function ($scope, ...some dependencies...) 
{ 
    .... 

Utilizzando ng-controller="MyController" nel codice HTML tutto funziona bene, ma ora voglio utilizzare questo controller come controllore della mia direttiva. Qualche cosa come questa:

otherModule.directive('myDirective', function() { 
    return { 
     restrict: 'A', 
     replace: true, 
     controller: ??????????, 
     scope: { 
      foo: '=', 
      blah: '=', 
     }, 
     template: '....' 
    } 
}); 

mi stanco solo mettendo MyController ma è errori fuori dicendo "MyController non è definita". Sono sicuro che se inserissi lo MyController nello spazio dei nomi globale, funzionerebbe bene, ma non voglio nulla nello spazio dei nomi globale. Se fa la differenza, myModule è definito come una dipendenza per otherModule. Come posso ottenere un riferimento a questo controller per la mia direttiva da utilizzare?

Come suggerito, ho provato $controller('MyController'), ma ora sto ottenendo il seguente errore:

Error: Unknown provider: $scopeProvider <- $scope <- myDirectiveDirective 
at Error (<anonymous>) 
at http://localhost/resources/angular.js?_=1360613988651:2627:15 
at Object.getService [as get] (http://localhost/resources/angular.js?_=1360613988651:2755:39) 
at http://localhost/resources/angular.js?_=1360613988651:2632:45 
at getService (http://localhost/resources/angular.js?_=1360613988651:2755:39) 
at invoke (http://localhost/resources/angular.js?_=1360613988651:2773:13) 
at Object.instantiate (http://localhost/resources/angular.js?_=1360613988651:2805:23) 
at http://localhost/resources/angular.js?_=1360613988651:4621:24 
at otherModule.directive.restrict (http://localhost/resources/app.js?_=1360613988824:862:15) 
at Object.invoke (http://localhost/resources/angular.js?_=1360613988651:2786:25) 

Non sono sicuro di cosa fare di questo errore. C'è più bisogno di fare questo lavoro?

+0

E 'un po' strano avere funzione di costruzione di controllo di una direttiva essere definito al di fuori della direttiva. Se per nessun altro motivo, gli argomenti iniettabili sono diversi per le funzioni del costruttore del controllore di direttive e il tipo di controller ng delle funzioni del costruttore del controllore. –

risposta

25

Sembra che si può semplicemente utilizzare:

controller: 'MyController' 

se il controller è nello stesso modulo come la direttiva o un modulo più alto livello composto dal modulo con la direttiva in esso.

Quando l'ho provato con due moduli diversi composti in un modulo app (uno per il controller e uno per la direttiva), non funzionava.

+0

+1 questa risposta è la migliore ... ma per chiunque altro trovi questo e ha bisogno di accedere a un controller in un altro modulo, ho aggiunto un'altra risposta. –

+1

In questo modo crea una nuova istanza di 'MyController' ... c'è un modo per accedere a quello esistente? – JaKXz

+1

No, non puoi. Se si desidera condividere un controller, annidare le direttive in un controller div-ng e non utilizzare un ambito isolato. –

10

La risposta che avete già accettato le opere, ed in quasi tutti i casi dovrebbe essere scelto ...

Per completezza: Ecco come è possibile utilizzare un controller da un altro modulo

(PS: non fare questo lol:. P)

var app = angular.module('myApp', ['myDirectives']); 

app.controller('AppCtrl1', function($scope) { 
    $scope.foo = 'bar'; 
}); 


var directives = angular.module('myDirectives', []); 

directives.directive('test', function($controller) { 
    return { 
     template: '<h1>{{foo}}</h1>', 
     link: function(scope, elem, attrs) { 
      var controller = $controller('AppCtrl1', { $scope: scope }); 

      console.log($scope.foo); //bar 
     } 
    }; 
}); 
+3

Grazie per la risposta, e hai ragione, non dovremmo farlo. – James

+0

Perché no? Mi sembra abbastanza pulito. –

+2

@nikkwong Beh, FWIW, la bellezza è negli occhi di chi guarda ... Ma iniettare una dipendenzaA ($ controller) per ottenere una dipendenzaB (AppCtrl1) da dipendenze di hardcoding dependencyB ($ scope) in una chiamata di funzione non è affatto cosa Io chiamerei "pulito". –

Problemi correlati