我们有一个大型Angularjs 1.6应用程序,该应用程序的$ rootscope分散在整个应用程序的过滤器,服务,路由等200多个位置中。因此需要对其进行重构,但是我不确定如何知道何时将其删除。什么时候在应用程序中使用$ rootscope是最佳实践?
我已经阅读了所有内容,从没读过,到用它来存储变量,我都以为是在控制器之间共享数据。从那以后,我读到最好在这种用例中使用工厂/服务,而且我还读到一个有效的用例是将$ rootscope用作全局事件总线。
我真的没有在Angularjs文档中看到这一点。
来自ng-book:
当Angular开始运行并生成视图时,它将创建从ng-app根元素到$ rootScope的绑定。$ rootScope是所有$ scope对象的最终父对象。$ rootScope对象是我们在Angular应用程序中最接近全局上下文的对象。在此全局上下文中附加太多逻辑是一个坏主意,就像弄脏JavaScript全局范围也不是一个好主意。
没错,您绝对应该使用 服务 在模块之间共享数据和逻辑。
在 $ rootScope中 放入大量逻辑意味着您的应用程序中的可维护性和模块性很差,测试问题也非常困难。
我强烈建议您看一下:
我知道将所有内容附加到 $ rootScope 可能很容易,但是很难进行工作,进行很少的更改,将代码重用于其他应用程序或模块并总体上测试应用程序。
编辑
最近,我不得不从API中获取一些项目并捕获这些项目,以便在特定视图中显示它们。项目的获取机制是确定的Factory,而格式化和显示项目的机制是确定的Controller。
Factory
Controller
因此,我必须在Factory获取商品时发出一个事件,并在中捕获该事件Controller。
$ rootScope方式
//Factory $rootScope.$broadcast('refreshItems', items); //Controller $scope.$on('refreshItems', doSomething());
显然可以,但是我真的不喜欢使用它,$rootScope而且我还注意到该任务的执行情况非常糟糕。
$rootScope
然后,我尝试对Postal.js进行尝试:
Postal.js是一种内存消息总线,受AMQP的启发很宽松,它是用JavaScript编写的。Postal.js在浏览器中运行,或在使用node.js的服务器上运行。它采用了熟悉的“事件样式”范例(大多数JavaScript开发人员都熟悉),并通过提供“代理”和订户实现对其进行扩展,这些实现比通常在简单事件发出/聚合中所发现的更为复杂。
我尝试将其Postal.js用于此类需求,但发现它确实比$rootScope用于此目的要快。
Postal.js
//Factory $scope.$bus.publish({ channel : 'reloadItems', topic : 'reloadItems' data : items ); //Controller $scope.$bus.subscribe({ channel : 'reloadItems', topic : 'reloadItems', callback : function () { resetAndLoadItems(); } });
希望对您有所帮助。