Jam*_*ard 4 angularjs angularjs-rootscope angularjs-1.6
我们有一个大型的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.
$ 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)
我希望我一直很有帮助.
| 归档时间: |
|
| 查看次数: |
8431 次 |
| 最近记录: |