AngularJS-哪个范围的性能更好? Object.key或某些变量?

时间:2018-11-20 06:03:31

标签: javascript angularjs performance

假设我必须存储客户信息,并且要管理双向绑定,我将在此处使用$scope。 所以我的疑问是,哪种方法更好?

$scope.firstname = "foo";
$scope.lastname = "bar";
$scope.cellno = "1234567890";
$scope.email = "foobar@example.com";

OR

$scope.customerDetailsObj = {};
$scope.customerDetailsObj.firstname = "foo";
$scope.customerDetailsObj.lastname = "bar";
$scope.customerDetailsObj.cellno = "1234567890";
$scope.customerDetailsObj.email = "foobar@example.com";`

我一直在想这个问题,因为我有一个大型的角度应用程序,有时观察者的数量超过了1500。我使用的是chrome扩展程序来观察者的数量。

请分享您的观点。谢谢。

2 个答案:

答案 0 :(得分:4)

我认为,按照angularjs guide的第一种方法(直接绑定到属性)会更有效。指南摘录:

  

可以使用三种策略来完成脏物检查:通过引用,通过   收集内容,并按价值。策略因种类而异   检测到的变化及其性能特征。

     
      
  • 按引用监视(scope。$ watch(watchExpression,侦听器))检测到监视表达式返回的整个值发生变化时   切换到新值。如果值是数组或对象,   无法检测到其内部的变化。这是最有效的   策略。
  •   
  • 监视集合内容(scope。$ watchCollection(watchExpression,侦听器))可检测到内部发生的更改。   数组或对象:添加,删除或重新排序项目时。的   检测很浅-不会进入嵌套的集合。   观看收藏内容要比观看   参考,因为收集内容的副本需要   保持。但是,该策略试图最大程度地减少   需要复制。
  •   
  • 按值监视(scope。$ watch(watchExpression,listener,true))可检测任意嵌套的数据结构中的任何更改。它是   最强大的变更检测策略,也是最昂贵的。   每个嵌套数据结构都需要完整遍历   摘要,它的完整副本需要保存在内存中。
  •   

enter image description here

答案 1 :(得分:1)

仅讨论性能 我认为 选项1(具有简单变量),这样会更有效率。

观看普通属性

$ watch()函数默认情况下仅检查对象引用的相等性。因此,在每个$ digest中,它将检查新值和旧值是否指向同一对象。

监视对象和数组

如果要$ watch()一个对象,则必须切换到深层监视,这意味着在每个$ digest中,它将检查整个树以查看结构或值是否已更改。因此,对象越大,支票就越昂贵。

$ watchGroup(),是对象/数组观察者的替代方法

如果您有一组相关属性,例如一个人(姓名,姓氏,年龄),则可以将其定义为普通属性,并使用$watchGroup(),其作用方式与普通$ watch相同(),但要列出要观看的属性列表,而不是一个。