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

时间:2013-10-24 12:23:15

标签: javascript angularjs angularjs-service

我需要在整个Angular应用程序中全局访问一个对象,我很乐意将此对象放在一个值服务中。
不幸的是,这个对象是由另一个服务计算的,我无法将myService注入到同一个value服务中。

ATM,我用这样的东西实现了我的目标:

全球服务代码

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上添加一个函数,那么将它放在一个可以在需要的地方注入的服务并且更容易测试时几乎总是更好。

     

相反,不要创建一个服务,其唯一目的是存储和返回数据位。



您是否真的知道我可以将服务注入服务价值的任何方式?

或者我可以利用任何其他Angular最佳实践?

<小时/> 我忘了一个非常重要的通知

对象的计算可能计算量很大,所以我绝对不希望每次从一个页面移动到另一个页面时重新计算它,或者其他任何东西。

3 个答案:

答案 0 :(得分:0)

  

我需要在整个Angular应用程序中全局访问一个对象

我会使用service。由于服务是单身,您可以将服务注册到所有控制器,并通过service共享任何数据。

  

不幸的是,这个对象是由另一个服务计算的,我无法将myService注入到相同的服务中。

只需创建一个将继承父级的主服务(Parent)和子服务。 (就像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

答案 1 :(得分:0)

理想情况下,使用$ rootScope存储一些全局要求的值是完全可以的。但如果您仍坚持使用模块,我建议您使用提供商。 使“myService”成为提供者,并允许您配置服务中的变量。

此处有更多信息 AngularJS: Service vs provider vs factory

答案 2 :(得分:0)

您可以使用$broadcastvalue服务中的值发送到myService

您仍然需要在每个服务中注入$rootscope,但从那时起,您可以在应用的其余部分注入myService

Reference here