为什么考虑全球职能"错误"在Angular 1.3中

时间:2014-12-01 16:16:22

标签: angularjs

传统上我已经像这样管理了我的Angular代码

//File 1
angular.module('name',[])
//File 2
function TestController(){

}
TestController.prototype.// inherited stuff
angular.module('name').controller('testController',TestController);

这很好用,让我可以轻松地对文件进行分区。现在我尝试升级到1.3并获得臭名昭着的......

Error: [ng:areq] Argument 'TestController' is not a function, got undefined 

当然这是由于this change声称希望清理人们编写代码的方式。这种模式怎么样更复杂?有没有办法在不改变全局设置的情况下维护这种模式?

2 个答案:

答案 0 :(得分:3)

实际上有一个comment on the page you linked有一个相当可靠的解释。

  

全局控制器指的是您的控制器被定义为功能   在窗口对象上。这意味着他们可以公开使用   与碰巧定义a的任何其他JavaScript冲突   具有相同名称的功能。不可否认,如果你后期修复你的   控制器与......控制器然后这可能不会发生但是   总是有机会,特别是如果你要使用一些   第三方图书馆。放这些控制器要安全得多   功能在模块的安全范围内。然后你有更多的控制权   在何时何地加载此模块。可是控制器   名称在单个Angular应用程序中是全局的,因此您仍然可以   有潜在的冲突,但至少你不能发生冲突   JavaScript全局命名空间中完全不同的代码。

因此,我们的想法是全局控制器函数可能与您使用的任何JavaScript中的任何其他全局函数冲突。因此,为了消除与您自己的代码或第三方脚本发生冲突的可能性,不使用全局控制器可以使您的代码更安全,更一致。

如@Brett的评论所述,您可以在原型制作中使用IIFE。 Here is an update of your plunk that uses that。主要变化就是这样。

(function() {
  TestController.prototype.name = 'World'
})();

答案 1 :(得分:0)

我想到的是两件事:

1)以这种方式,功能不会比他们应该更多地保存在记忆中。

2)如果你缩小你的代码,minifyer将必须为所有全局对象生成新的名称,这在你有一个小项目时是非常的,但是当它没有时会出现问题。

此外,它应该阻止测试修改不必要的数据。