在Angularjs应用程序中使用$ rootscope的最佳实践?

Jam*_*ard 4 angularjs angularjs-rootscope angularjs-1.6

我们有一个大型的Angularjs 1.6应用程序,它将$ rootscope分散在整个应用程序中,分布在过滤器,服务,路由等200多个地方.所以它需要重构,但我不知道如何知道何时删除它.何时在应用程序中使用$ rootscope是最佳做法?

我从头读过所有内容,用它来存储变量,我假设它是用于在控制器之间共享数据.我已经读过,最好将工厂/服务用于此用例,我还读到一个有效的用例是使用$ rootscope作为全局事件总线.

我没有在Angularjs文档中看到这个解释.

And*_*M16 9

来自ng-book:

当Angular开始运行并生成视图时,它将创建从根ng-app元素到$ rootScope的绑定.这个$ rootScope是所有$ scope对象的最终父对象.$ rootScope对象是我们在Angular应用程序中与全局上下文最接近的对象.将过多的逻辑附加到这个全局上下文是一个坏主意,就像弄脏JavaScript全局范围不是一个好主意一样.

你是对的,你绝对应该使用服务来共享模块之间的数据和逻辑.

$ rootScope中加入大量逻辑意味着在应用程序中具有较差的可维护性和模块性,因此测试问题也非常困难.

我强烈建议你看看:

我知道将所有东西都附加到$ rootScope可能很容易,但是很难对它进行处理,做一点改动,将代码重用于其他应用程序或模块并测试你的应用程序.

编辑

最近我不得不从API获取一些项目并捕获这些项目,以便在某个视图中显示它们.项目获取机制是一定的Factory,而格式化和显示项目的机制是在Controller.

因此,我必须在Factory获取项目时发出一个事件并在中捕获此事件Controller.

$ rootScope方式

//Factory
$rootScope.$broadcast('refreshItems', items);
//Controller
$scope.$on('refreshItems', doSomething());
Run Code Online (Sandbox Code Playgroud)

它显然有效,但我真的不喜欢使用$rootScope,我也注意到这项任务的表现非常悲惨.

然后我试着给Postal.js一个镜头:

Postal.js是一种内存消息总线 - 由AMQP激发的非常宽松 - 用JavaScript编写.Postal.js在浏览器中运行,或者使用node.js在服务器上运行.它采用熟悉的"事件风格"范例(大多数JavaScript开发人员都熟悉)并通过提供"代理"和订阅者实现来扩展它,这些实现比您在简单事件发送/聚合中通常发现的更复杂.

我尝试使用Postal.js这种需求,我发现它真的比$rootScope用于此目的更快.

//Factory
$scope.$bus.publish({
                  channel : 'reloadItems',
                  topic   : 'reloadItems'
                  data    : items
);

//Controller
$scope.$bus.subscribe({
  channel  : 'reloadItems',
  topic    : 'reloadItems',
  callback : function () {
    resetAndLoadItems();
  }
});
Run Code Online (Sandbox Code Playgroud)

我希望我一直很有帮助.