[英]Angular JS - How to safely retain global value “extracted” using a service
我需要一个在整个Angular应用程序中都可以全局访问的对象,并且很高兴将此对象放入值服务中。
不幸的是,该对象是由另一个服务计算的,并且我无法将myService
注入相同的value
服务。
自动取款机,我已经实现了这样的目标:
全球服务代码
app.service('myService', function() {
this.foo = function() {
// some code that returns an object
return computedObject
}
})
app.run(function ($rootScope, myService) {
$rootScope.global = {dbObject: myService.foo()}
})
只要将$rootScope
注入其中,我就可以在任何令我$rootScope
控制器中使用
但是,我不喜欢将整个$rootScope
注入我该死的对象的任何地方,而且我相信也不安全(或有效吗?),因为该团队已指定
当然,全局状态很糟糕,您应该谨慎使用$ rootScope,就像(希望)使用任何语言的全局变量一样。 特别是,不要将其用于代码,而仅用于数据。 如果您想在$ rootScope上放置一个函数,最好总是将其放在可以在需要的地方注入并且更容易测试的服务中。
相反,请勿创建服务,其唯一的目的就是存储和返回数据位。
也许,您是否知道我可以将服务注入服务价值的任何方式?
还是我可以利用的其他任何Angular最佳实践?
对象的计算可能会非常耗费计算资源,因此我绝对不希望每次我在一页或另一页上移动时都重新计算它。
我需要在整个Angular应用程序中都可以全局访问的对象
我会用service
。 由于服务是单例,因此您可以将服务注册到所有控制器,并通过service
共享任何数据。
不幸的是,该对象是由另一个服务计算的,并且我无法将myService注入相同的价值服务。
只需创建一个将继承父级的主服务(父级)和子级服务即可。 (例如Java世界中的抽象服务)。
Application.factory('AbstractObject', [function () {
var AbstractObject = Class.extend({
virtualMethod: function() {
alert("Hello world");
},
abstractMethod: function() { // You may omit abstract definitions, but they make your interface more readable
throw new Error("Pure abstract call");
}
});
return AbstractObject; // You return class definition instead of it's instance
}]);
Application.factory('DerivedObject', ['AbstractObject', function (AbstractObject) {
var DerivedObject = AbstractObject.extend({
virtualMethod: function() { // Shows two alerts: `Hey!` and `Hello world`
alert("Hey!");
this._super();
},
abstractMethod: function() {
alert("Now I'm not abstract");
}
});
return DerivedObject;
}]);
现在,我们可以向AbstractObject
添加一些逻辑并继续使用DerivedObject
这是示例Plunker
理想情况下,完全可以使用$ rootScope存储一些全局所需的值。 但是,如果您仍然坚持使用模块,建议您使用提供程序。 使您的“ myService”成为提供者,这将使您可以配置服务中的变量。
此处更多信息AngularJS:服务vs提供者vs工厂
您可以使用$broadcast
将值从value
服务发送到myService
。
您仍然需要将$rootscope
注入每个服务,但是从那时起,您可以将myService
注入应用程序的其余部分。
参考这里 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.