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
}])