假设我必须存储客户信息,并且要管理双向绑定,我将在此处使用$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扩展程序来观察者的数量。
请分享您的观点。谢谢。
答案 0 :(得分:4)
我认为,按照angularjs guide的第一种方法(直接绑定到属性)会更有效。指南摘录:
可以使用三种策略来完成脏物检查:通过引用,通过 收集内容,并按价值。策略因种类而异 检测到的变化及其性能特征。
- 按引用监视(scope。$ watch(watchExpression,侦听器))检测到监视表达式返回的整个值发生变化时 切换到新值。如果值是数组或对象, 无法检测到其内部的变化。这是最有效的 策略。
- 监视集合内容(scope。$ watchCollection(watchExpression,侦听器))可检测到内部发生的更改。 数组或对象:添加,删除或重新排序项目时。的 检测很浅-不会进入嵌套的集合。 观看收藏内容要比观看 参考,因为收集内容的副本需要 保持。但是,该策略试图最大程度地减少 需要复制。
- 按值监视(scope。$ watch(watchExpression,listener,true))可检测任意嵌套的数据结构中的任何更改。它是 最强大的变更检测策略,也是最昂贵的。 每个嵌套数据结构都需要完整遍历 摘要,它的完整副本需要保存在内存中。
答案 1 :(得分:1)
仅讨论性能, 我认为 选项1(具有简单变量),这样会更有效率。
观看普通属性
$ watch()函数默认情况下仅检查对象引用的相等性。因此,在每个$ digest中,它将检查新值和旧值是否指向同一对象。
监视对象和数组
如果要$ watch()一个对象,则必须切换到深层监视,这意味着在每个$ digest中,它将检查整个树以查看结构或值是否已更改。因此,对象越大,支票就越昂贵。
$ watchGroup(),是对象/数组观察者的替代方法
如果您有一组相关属性,例如一个人(姓名,姓氏,年龄),则可以将其定义为普通属性,并使用$watchGroup(),其作用方式与普通$ watch相同(),但要列出要观看的属性列表,而不是一个。