我最近使用JSHint开始,并要求我使用的“使用严格”的函数形式。 此后,AngularJS抛出一个错误:
“错误:参数‘webAddressController’不是一个函数,得到了未定义”
当我删除的功能表“使用严格的”控制加载罚款。
控制器:
(function () {
"use strict";
function webAddressController($scope, $rootScope, web_address_service) {
// Do things
}
}());
有没有人对这里发生了什么任何见解?
首先,我想声明的pkozlowski真正知道他的东西在棱角分明,但其实这是没有那么多的角的问题,因为它是封闭的问题。
角正在寻找在两个地方控制器:
- 在自身通过Module.controller注册控制器的注册表()
- 在一个全局变量(或全局函数声明)
问题是,你的一切瓶盖内的“使用严格”是不是全球性的。 它包裹起来,并在包含它的匿名函数私有化。
(function() {
// nothing in here is global or even public.
// "use strict" or not.
"use strict"; // this is mostly irrelevant.
// this will not work, because it's wrapped and not global
function ThisDoesntWork($scope) {
};
// window is the global root variable. So this works.
window.ThisWorks = function($scope) {
};
// this will work, because it's explicitly registering the controller
// presuming app is your Module variable from outside of the closure.
app.controller('ThisIsBest', function($scope) {
});
})();
//this works because it's global.
function ThisAlsoWorks($scope) {
}
// if you declare a global var, then set it inside
// of your closure, you're good to go too.
var ThisWillWorkToo;
(function {
//here we're setting it again.
ThisWillWorkToo = function($scope) {
};
})();
// if you're really crazy you can even do this...
var ThisWillWorkButItsWeird = (function() {
"use strict";
function ThisWillWorkButItsWeird($scope) {
}
return ThisWillWorkButItsWeird;
})();
在这一天结束时,你可以把“使用严格”的任何函数内,或者在文件级别,如果你喜欢。 “使用严格”本身不是打破了你什么。 有一千种方式来注册一个控制器,你可以看到。 最好的选择可能是与.controller法只是明确注册他们的建议。
我想这JSHint正试图在这里告诉你的是,以避免全局变量(这显然是一个非常好的做法!)。
AngularJS有关于解决同样的问题略有不同的意见(即-避免全局变量),并允许您定义模块控制器(使用全局angular
命名空间)。 你可以使用这样的模块重写你的例子:
angular.module('myApp',[]).controller('webAddressController', function($scope) {
// Do things
});
这里是的jsfiddle说明在实践中: http://jsfiddle.net/t3vBE/1/
通过这种方法,你不会污染带控制器构造全局命名空间。
您将需要更改JSHint配置,以允许angular
全局变量,如果你要使用的严格模式。 或者你也可以换你的整个代码(再次使用模块)转换成被imediatelly执行的功能:
(function () {
"use strict";
angular.module('myApp',[]).controller('webAddressController', function($scope) {
$scope.name = 'World';
// Do things
});
}());
这里是的jsfiddle: http://jsfiddle.net/t3vBE/4/
对我来说,这使得只有当你要定义纯JavaScript,“帮手”的功能意义,否则我会依赖于AngularJS服务。
另一种方式做,如果你的角模块已经被加载在其他地方有什么@pkzolowski做:
var app = angular.module('myApp');
app.controller(...);
app.service(...);
...
它是基于从这里评论: angularjs在不同的文件相同的模块定义服务
要注意的是使用angular.module(“Mymodule中”,[])将创建模块Mymodule中和覆盖任何现有的命名MyModule的模块。 使用angular.module(“Mymodule中”)来检索现有模块。
您是否尝试过写“用严格的”之外,前(函数()
"use strict"; // <-- add it here
(function () {
//"use strict"; <-- remove from here
function webAddressController($scope, $rootScope, web_address_service) {
// Do things
}
}());
我的答案是基于我所看到的所产生的文件约曼