我对AngularJS应用有个主意,我很好奇AngularJS社区是否认为可以这样做。简而言之,我正在连接到数据API并将结果显示在页面上。
我创建了一个AngularJS服务,该服务在上创建了一个数据存储$rootScope.DataStore。我还有一个服务方法,可以使用从API端点返回的数据更新DataStore。如果我使用来从控制器内部请求“ products” API端点DataStore.update('products'),则它将$rootScope.DataStore.products使用我的产品数据进行更新。
$rootScope.DataStore
DataStore.update('products')
$rootScope.DataStore.products
现在,在视图/部分视图中,我要做的就是ng-repeat="product in DataStore.products"显示数据,而与我所处的控制器范围无关。因此,从本质上讲,我的DataStore是我唯一的真理来源。
ng-repeat="product in DataStore.products"
我从这种方法中获得的好处是易于理解语义并减少了控制器编码。因此,无论何时更新DataStore,绑定到DataStore的任何内容也会被更新。
这会给$rootScope摘要周期增加过多的负担,还是这样做很奇怪?还是这是一种很棒的方式?:)欢迎任何评论。
$rootScope
在以下引用的AngularJS FAQ中解决了这个问题:
有时,有些数据要对整个应用程序进行全局处理。对于这些,您 可以 像其他作用域一样 注入$ rootScope 并在其上设置值。由于作用域是从根作用域继承而来的,因此这些值将可用于附加到ng-show之类的指令的表达式,就像本地$ scope上的值一样。
似乎团队确实鼓励使用$rootScope这种方式,但要注意以下几点:
当然,全局状态很糟糕,您应该谨慎使用$ rootScope,就像(希望)使用任何语言的全局变量一样。特别是,不要将其用于代码,而仅用于数据。如果您想在$ rootScope上放置一个函数,最好总是将其放在可以在需要的地方注入并且更容易测试的服务中。 相反,请勿创建仅在生命中唯一目的是存储和返回数据位的服务。
当然,全局状态很糟糕,您应该谨慎使用$ rootScope,就像(希望)使用任何语言的全局变量一样。特别是,不要将其用于代码,而仅用于数据。如果您想在$ rootScope上放置一个函数,最好总是将其放在可以在需要的地方注入并且更容易测试的服务中。
相反,请勿创建仅在生命中唯一目的是存储和返回数据位的服务。
这不会给$digest周期带来太大的负担(它实现了基本的脏检查以测试数据突变),而且这并不是一种奇怪的处理方式。
$digest
编辑: 有关性能的更多详细信息,请参见Misko(AngularJS开发人员)的关于SO的答案:数据绑定在AngularJS中如何工作? 特别注意有关性能的部分。