【发布时间】:2014-05-28 11:12:49
【问题描述】:
AngularJs 中defining a controller 的可用方式很少。具体来说:
- “附加到
$scope”语法 - “控制器为”语法
-
controller()函数
以上代码展示:
// 1)
ng-controller="MyControllerFn"
// 2)
ng-controller="MyControllerFn as myCtrl"
// 3)
myModule.controller("myCtrl", MyControllerFn);
// or
myApp.controller("myCtrl", ["$scope", function($scope) {
}]);
当然,每一个都有它的优点和缺点。目前我正在使用选项1)。我的问题是,我不知道从长远来看我是否没有遗漏任何东西,现在我可以使用新的“控制器作为”语法。我们的项目非常大,我看不到自己在一年左右的时间内将所有内容都重写为新语法,因为旧语法已被弃用。我宁愿现在慢慢过渡,从今天开始以“好的方式”编写新代码。
一些优点和缺点:
1)
- (好)与 3) 相比样板更少,因为控制器的自动发现会在遇到
ng-controller指令时为您处理声明 - (坏)支持正确的 DI:
MyControllerFn.$inject = [...] - (不好)难以在控制器的继承树中导航
2)
- (好)控制器别名清楚地表明了哪些范围变量引用了
- (好)更清晰的控制器语法,因为将变量分配给
this - (好)似乎正在改进工具支持 (IDE)
- (坏)向范围添加太多东西容易出错,例如:`this.arr = ...; // 100 万个项目的数组'
3)
- (中性)缩小正确(嗯,这可以通过
$inject属性完成) - (不好)更冗长的语法,可以通过自动发现完全避免
好的,我错过了什么吗?也许我没有看到明显的东西,因为我最近才迁移到 1.2?
= 编辑
为了清楚起见,绑定和声明控制器是有区别的。前两个演示的选项是关于将控制器绑定到 DOM,而第三个是关于在 Angular 模块中显式声明它。对后者的反对是允许 Angular 通过 DOM 并自动发现控制器,这是我喜欢的做事方式。
【问题讨论】:
标签: javascript angularjs angularjs-controller