【发布时间】:2014-12-30 18:09:13
【问题描述】:
很长一段时间以来,我一直在想这个问题:在使用 AngularJS 时,我应该直接使用视图上的模型对象属性还是可以使用函数来获取该属性值?
我一直在 Angular 中做一些小型家庭项目,并且(特别是使用只读指令或控制器)我倾向于创建范围函数来访问和显示范围对象及其在视图上的属性值,但性能-明智,这是一个好方法吗?
这种方式似乎更容易维护视图代码,因为如果由于某种原因更改了对象(由于服务器实现或任何其他特定原因),我只需要更改指令的 JS 代码,而不是 HTML . 这是一个例子:
//this goes inside directive's link function
scope.getPropertyX = function() {
return scope.object.subobject.propX;
}
在我看来我可以简单地做
<span>{{ getPropertyX() }}</span>
而不是
<span>{{ object.subobject.propX }}</span>
在有时涉及的 HTML 混乱中更难维护。 另一种情况是使用范围函数来测试属性值以在 ng-if 上进行评估,而不是直接使用该测试表达式:
scope.testCondition = function() {
return scope.obj.subobj.propX === 1 && scope.obj.subobj.propY === 2 && ...;
}
那么,这种方法有什么优点/缺点吗?你能给我一些关于这个问题的见解吗?最近一直困扰着我,一个繁重的应用程序可能会如何表现,例如,指令可能变得非常复杂,并且最重要的是可以在可能生成数百或数千个实例的 ng-repeat 中使用。
谢谢
【问题讨论】:
-
一个缺点是有很多摘要循环,因此最小化函数调用会更高效。如果您将其中一个函数放入
ng-repeat并在其中添加console.log,您将看到比您最初预期的更多的日志 -
我认为为所有属性创建函数并不是一个好主意。不仅每个摘要周期都会进行更多的函数调用,以查看函数返回值是否发生了变化,而且对我来说,它的可读性和可维护性似乎确实降低了。它可能会向您的控制器添加许多不必要的代码,并且有点使您的控制器成为视图模型。您的第二种情况似乎非常好,复杂的操作似乎正是您希望控制器处理的。
-
这只是让我想知道的事情(即使您的两个 cmets 都完全有效并且我同意它们):这样我们必须在视图代码上维护对象属性(当我们想要显示它们)和控制器代码(例如,当我们想通过比较这些属性来有条件地在视图上显示内容时)。
-
@JasonGoemaat 直接使用属性和使用简单的getter函数真的有区别吗?每个摘要周期都将评估任何一个。函数调用本身是否真的有足够的开销会导致性能显着差异?还是我对某事有错误的理解?
-
提前考虑,我看到 Angular 2.0 将合并 Object.observe(),因此可能会产生更大的影响。
标签: javascript angularjs model-view-controller angularjs-directive