繁体   English   中英

Angular JS-如何使用服务安全地保留“提取的”全球价值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM