在Object.defineProperty上避免使用AngularJS的观察者

时间:2015-08-06 20:06:04

标签: angularjs breeze single-page-application

我扩展了我的实体,这些实体由breezejs提供,其属性是对属性的递归调用的结果。该属性仅显示,我从不想存储该值。

特别是我添加了一个“开始”和一个“结束”属性,它取决于它之前的实体的“结束”日期和当前实体的时间跨度。这些值是确定性的,存储它们没有任何意义。这很有效,直到我有几千个实体。此时,由于在计算过程中触及的所有属性导致双向绑定,性能坦克。

我有一个缓存方案,只是希望angularjs在计算“start”和“end”属性时什么也不做。

在计算这些属性时,如何防止出现任何观察者/双向绑定?

从更广泛的意义上讲,如何处理angularjs中的大量数据而不会淹没在观察者中?

修改

这样的东西似乎是解决方案: https://coderwall.com/p/d_aisq/speeding-up-angularjs-s-digest-loop

范围内的观察者在手术期间被暂停,然后在我完成后恢复。

var watches = scope.$$watchers;
scope.$$watchers = [];

// do fast computation that touches a lot of data

scope.$$watchers = watchers;

编辑2:

这是在绑定到视图之前,这是在装配数据中进行绑定。我不认为可以在控制器中完成一次时间绑定吗?

1 个答案:

答案 0 :(得分:1)

与@ zeroflagL的建议一样,一次性绑定是一个可用的选项

  

以::开头的表达式被视为一次性表达式。一次性表达式将在稳定后停止重新计算,如果表达式结果为非未定义值,则会在第一次摘要后发生

Expressions @ angularjs.org

此外,如果要开始不会触发摘要周期的计算,请不要更改$ scope上的任何成员。只需使用“var”,并在流程结束时执行$ scope.data = newValue;