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)。我的问题是,我不知道我是否在长期内没有遗漏任何东西,现在可以使用新的“控制器为”语法了。我们的项目非常庞大,我看不到自己在一年左右的时间内将所有内容重写为新语法,只是因为旧版本被弃用了。我现在宁愿慢慢过渡,从今天开始以“好方法”编写新代码。
少有PROS和缺点:
1)
ng-controller
指令时会为您处理声明MyControllerFn.$inject = [...]
2)
this
3)
$inject
属性完成)好的,我错过了什么吗?也许我没有看到明显的东西,因为我刚刚搬到1.2?
为清楚起见,绑定和声明控制器之间存在差异。前两个演示的选项是关于将控制器绑定到DOM,而第三个是关于在角度模块中明确声明它。反对后者将允许Angular通过DOM并自动发现控制器,这是我首选的做事方式。
答案 0 :(得分:0)
直截了当:
首先,需要完成两件不同的事情:
new
ed"以创建控制器实例的功能。)然后将Angular的工作联系起来是
(1)和(2)是将控制器绑定到DOM元素的方法
除此之外,还有指令的controller
属性和ngRoute
controller
属性,您根本不提及。< / p>
(3)是一种用Angular的DI注册控制器实现的方法(它负责实例化绑定到特定元素的控制器。
从这个意义上说,通过函数的名称自动匹配控制器实现(你所谓的(自动发现)是(3)的替代,所以让它命名为(4)。
根据以上所述,(1)和(2)不是(3)和(4)的替代方法,但它们都是必需的并且相互补充。
从以上功能,&#34;自动发现&#34;是我想要最少依赖的人 它感觉hacky /不是非常强大&#34;它的目的是减少快速组合小型原型或示例所需的代码,而不是用于大规模的生产应用程序。
来自Angular的 Developer Guide :
注意:虽然Angular允许您在全局范围内创建Controller函数,但不建议这样做。在实际应用程序中,您应该使用Angular模块的
.controller
方法来处理应用程序[...]
IMO,真正的争论是关于controller
vs contoller as
。
以下是一些注意事项:
controller as
功能是一项新功能,可能仍处于评估阶段。它可能会留下来,但我不会把所有的钱押在上面。
在controller as
语法中,没有实际的$scope
(即Scope
对象,$rootScope
等的后代)。这一事实对于您如何执行某些$scope
特定内容有一些影响,例如使用$on()
注册听众,$watch
注册属性等。
controller as
语法可能会提高视图的可维护性/可读性,因为它明确了每个属性引用的控制器 - 它避免了通过原型保留,被覆盖等属性的情况。另一方面,原型继承的缺失限制了数据的传播方式。
也就是说,我稍微偏好controller
语法,因为我发现$scope
提供的实用程序非常有用,而且在我的项目中找不到任何可用的用例controller as
语法更可取。