Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度自定义指令:将控制器属性设置为`函数(范围){}时发生奇怪错误`_Javascript_Angularjs_Angularjs Directive_Angularjs Controller - Fatal编程技术网

Javascript 角度自定义指令:将控制器属性设置为`函数(范围){}时发生奇怪错误`

Javascript 角度自定义指令:将控制器属性设置为`函数(范围){}时发生奇怪错误`,javascript,angularjs,angularjs-directive,angularjs-controller,Javascript,Angularjs,Angularjs Directive,Angularjs Controller,当我编写自定义指令时,一个奇怪的错误阻止了我 angular.module('app.directives', []) .directive('cyMenu', ['RecursionHelper', function(RecursionHelper) { function postLink(){}; return { restrict: 'E', templateUrl: 'views/component/cy-menu.html',

当我编写自定义指令时,一个奇怪的错误阻止了我

angular.module('app.directives', [])
.directive('cyMenu', ['RecursionHelper', function(RecursionHelper) {
    function postLink(){};
    return {
        restrict: 'E',
        templateUrl: 'views/component/cy-menu.html',
        replace: true,
        transclude: false,
        require: '?^cyMenu',
        controller: function ($scope) { // when set this argument($scope) to scope, error occurs.
            this.getList = function() {
                return $scope.list;
            }
        },
        scope: {
            list: '=',
            isSubmenu: '@'
        },
        compile: function(tElement) {
            return RecursionHelper.compile(tElement, postLink);
        }
    }
}
正如我指出的,当我将controller属性设置为controller:function scope{}时,会出现以下错误:

Error: [$injector:unpr] Unknown provider: scopeProvider <- scope
http://errors.angularjs.org/1.3.6/$injector/unpr?p0=scopeProvider%20%3C-%20scope
...

一个非常好的做法是将每个组件分离到一个单独的文件中,因此我首先将控制器放在这样一个文件中:

//File recursionHelperController.js
(function() {
  'use strict';

  angular
    .module('app.controllers')
    .controller('RecursionHelperController', RecursionHelperController);

  RecursionHelperController.$inject = ['$scope'];

  function RecursionHelperController($scope) {
     //do your stuff
  }

})();
请注意,我为控制器或任何角度元素提供了我所知道的最正确的格式,但您可以做一些更简单的事情,如:

angular.module('app.controllers')
.controller('RecursionHelperController', ['$scope', function($scope) {
         //do your stuff
      }])
然后,您可以在主文件中调用此控制器:

controller: 'RecursionHelperController'
希望能有帮助

更新:

有时自动注入会有一些问题,这就是为什么我建议用显式注入的方式来实现它。出于清晰和教程目的,角度文档仅显示最简单的方法

更新2

如果不想分离控制器,请尝试使用注入安全表示法

controller : ['$scope', function($scope) {
     //do your stuff
  }])

注入似乎失败了,因为您试图在“controller”参数中进行注入,在那里进行注入通常有点棘手。您应该尝试在一个单独的文件中定义控制器,并在“controller”参数中按名称插入它。@sam您能告诉我为什么或者更详细地解释一下吗?我发现官方的演示也一样:-myTabs演示。谢谢你的解释。在我的代码中,RecursionHelper是一个帮助处理递归指令的服务,我将它拆分为另一个文件。但是控制器只用于使我的递归指令能够相互通信,所以我不想将其分离。有时自动注入有一些麻烦,你写的可能是我真正想要的。然后你应该使用显式注入符号,就像我刚刚在更新2或几秒钟内输入的那样;我的最后一个想法奏效了吗?我这样问是因为我从来没有试过,我很高兴知道。虽然我从来没有发现为什么这种显式注射是必要的,但我正在搜索有关注射的详细信息,如果你知道一些事情,请更新这个答案并让我知道。
controller : ['$scope', function($scope) {
     //do your stuff
  }])