传统上我已经像这样管理了我的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声称希望清理人们编写代码的方式。这种模式怎么样更复杂?有没有办法在不改变全局设置的情况下维护这种模式?
答案 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将必须为所有全局对象生成新的名称,这在你有一个小项目时是非常的,但是当它没有时会出现问题。
此外,它应该阻止测试修改不必要的数据。