2013-02-11 15 views
13

У меня есть контроллер, зарегистрированный как это:Как я могу использовать зарегистрированный контроллер в моей угловой директиве?

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

Использование ng-controller="MyController" в HTML все работает отлично, но теперь я хочу использовать этот контроллер в качестве контроллера моей директивы. Некоторые вещи, как это:

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

Я устал просто положить MyController, но это ошибки, говоря «MyController не определен». Я уверен, что если бы я просто поместил MyController в глобальное пространство имен, это сработает нормально, но я не хочу ничего в глобальном пространстве имен. Если это имеет значение, myModule определяется как зависимость для otherModule. Как я могу получить ссылку на этот контроллер для моей директивы для использования?

Как было предложено, я попытался $controller('MyController'), но теперь я получаю следующее сообщение об ошибке:

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) 

я не уверен, что сделать из этой ошибки. Нужно ли больше делать эту работу?

+0

это немного странно иметь контроллер функции конструктора директиву определимся вне директивы. Если по какой-либо другой причине аргументы для инъекций различаются для функций конструктора контрольных контроллеров и функций контроллера контроллера ng-controller. –

ответ

25

Похоже, что вы можете просто использовать:

controller: 'MyController' 

Если контроллер находится в том же модуле, директивы или более высокого уровня, в составе модуля модуля с директивой в нем.

Когда я попробовал это с двумя разными модулями, составленными в модуль приложения (один для контроллера и один для директивы), это не сработало.

+0

+1 этот ответ лучший ... но для тех, кто находит это и нуждается в доступе к контроллеру в другом модуле, я добавил еще один ответ. –

+1

Этот способ создает новый экземпляр 'MyController' ... есть ли способ доступа к существующему? – JaKXz

+1

Нет, вы не можете. Если вы хотите поделиться контроллером, затем вставьте директивы в div ng-контроллер и не используйте изолированную область. –

10

Ответ вы уже приняли работы, и в почти во всех случаях должны быть выбраны ...

Для полноты картины: Вот как вы можете использовать контроллер от другого модуля

(PS: не делайте это лол.: 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

Спасибо за ответ, и вы правы, мы не должны этого делать. – James

+0

Почему бы и нет? Выглядит довольно чисто для меня. –

+2

@nikkwong Ну, FWIW, красота в глазах смотрящего ... Но вложение зависимого ($ controller), чтобы получить зависимость (AppCtrl1) с помощью зависимостей зависимости hardcoding dependencyB ($ scope) от вызова функции вовсе не является тем, что Я бы назвал «чистым». –