0

我需要一个可以在整个 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 最佳实践?


我忘记了一个非常重要的通知

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

4

3 回答 3

0

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

我会用service. 由于 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

于 2013-10-24T12:32:37.173 回答
0

理想情况下,使用 $rootScope 来存储一些全局所需的值是完全可以的。但是如果你仍然坚持使用模块,我建议你使用提供者。将您的“myService”设为提供者,这样您就可以在服务中配置变量。

更多信息在这里 AngularJS:服务vs提供者vs工厂

于 2013-10-24T12:37:15.740 回答
0

您可以使用$broadcast将值从value服务发送到myService.

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

参考这里

于 2013-10-24T12:42:47.960 回答