13

我有一个这样注册的控制器:

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

在 HTML 中使用ng-controller="MyController"一切正常,但现在我想将此控制器用作我的指令的控制器。像这样的一些事情:

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

我厌倦了只是放,MyController但它错误地说“MyController is not defined”。我确定如果我只是放入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) 

我不知道该怎么做这个错误。是否还需要做这项工作?

4

2 回答 2

25

看来您可以使用:

controller: 'MyController' 

如果控制器与指令位于同一模块中,或者位于由包含指令的模块组成的更高级别的模块中。

当我尝试将两个不同的模块组合成一个应用程序模块(一个用于控制器,一个用于指令)时,它不起作用。

于 2013-02-11T20:39:22.057 回答
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
       }
   };
});
于 2013-02-11T20:46:22.563 回答