【发布时间】:2015-01-28 23:55:18
【问题描述】:
有人告诉我,controllerAs 模式通过在作用域上附加更少的东西来提高 AngularJS 应用程序的性能。
我无法真正理解这是如何发生的,因为使用 controllerAs 控制器本身会在作用域上公开它的属性。
这真的能提高性能吗? 如果是,那么如何以及为什么?
【问题讨论】:
标签: angularjs
有人告诉我,controllerAs 模式通过在作用域上附加更少的东西来提高 AngularJS 应用程序的性能。
我无法真正理解这是如何发生的,因为使用 controllerAs 控制器本身会在作用域上公开它的属性。
这真的能提高性能吗? 如果是,那么如何以及为什么?
【问题讨论】:
标签: angularjs
ControllerAs 语法本身并不会提高应用的性能,但它确实会鼓励其他对性能产生重大影响的编程模式。
最值得注意的是,使用$scope 作为变量的存储库具有鼓励在全局范围内使用$scope 的效果,因此程序员习惯于将事物添加到可以从任何地方访问的范围内。这是一个重大缺陷,可能会导致许多性能问题。
同样在使用 ControllerAs 时,因为控制器实例将是 $scope 上的唯一属性,所以视图模板上的所有字段都将是引用属性。这样可以避免JavaScript prototype链继承坑。
Angular Best Practice Always have a . in binding 表达式是由 ControllerAs 语法自动、自然地强制执行的。
【讨论】:
我相信使用“控制器”绑定到视图的动机与遵循 MVC 的最佳实践有关,而不是与性能有关。
Model - JSON objects
View - Directives
Controller - ngControllers
控制器的工作是调解服务和视图模型之间的交互(在 AngularJS 中,视图模型由范围表示)。
视图模型的工作是为视图表示模型,因此它不应包含任何重要的逻辑。
控制器逻辑的最佳位置是控制器本身 - 事件处理程序应该调用控制器方法,该方法调用返回模型的服务,然后将其保存在视图范围内。 视图(指令)使用模型(范围),以呈现最终视图。
就我个人而言,我希望看到 Angular 框架的变化,让 controllerAs 调用视图中隐含的方法,并取消作用域上的绑定方法。关于这个特定主题,我发现从视图中调用闭包中的函数并不是很有用。
【讨论】: