AngularJS控制器和“使用严格”(AngularJS controllers and “use

2019-08-01 15:07发布

我最近使用JSHint开始,并要求我使用的“使用严格”的函数形式。 此后,AngularJS抛出一个错误:

“错误:参数‘webAddressController’不是一个函数,得到了未定义”

当我删除的功能表“使用严格的”控制加载罚款。

控制器:

(function () {
    "use strict";

    function webAddressController($scope, $rootScope, web_address_service) {
             // Do things
    }

}());

有没有人对这里发生了什么任何见解?

Answer 1:

首先,我想声明的pkozlowski真正知道他的东西在棱角分明,但其实这是没有那么多的角的问题,因为它是封闭的问题。

角正在寻找在两个地方控制器:

  1. 在自身通过Module.controller注册控制器的注册表()
  2. 在一个全局变量(或全局函数声明)

问题是,你的一切瓶盖内的“使用严格”是不是全球性的。 它包裹起来,并在包含它的匿名函数私有化。

(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法只是明确注册他们的建议。



Answer 2:

我想这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服务。



Answer 3:

另一种方式做,如果你的角模块已经被加载在其他地方有什么@pkzolowski做:

var app = angular.module('myApp');
app.controller(...);
app.service(...);
...

它是基于从这里评论: angularjs在不同的文件相同的模块定义服务

要注意的是使用angular.module(“Mymodule中”,[])将创建模块Mymodule中和覆盖任何现有的命名MyModule的模块。 使用angular.module(“Mymodule中”)来检索现有模块。



Answer 4:

您是否尝试过写“用严格的”之外,前(函数()

"use strict"; // <-- add it here
(function () {
    //"use strict"; <-- remove from here

    function webAddressController($scope, $rootScope, web_address_service) {
         // Do things
    }

}());

我的答案是基于我所看到的所产生的文件约曼



文章来源: AngularJS controllers and “use strict”