在 Angular 2 中注入应用程序服务实例

Inject application services instance in Angular 2

我想要application-wide服务。 在我的应用程序组件中,我定义了

import {ItemService} from 'services/itemService';
import {ApplicationService} from 'services/applicationService';

@Component({
    selector: 'app',
    viewInjector: [ItemService, ApplicationService]
})
//...

在我的 child 观点中:

import {ItemService} from 'services/itemService';
import {ApplicationService} from 'services/applicationService';
//...
class MyView {
    constructor(itemService: ItemService, applicationSrevice:ApplicationService) {
    }
}

问题是每个视图都会创建其服务实例。

我不确定这是最简洁的方法,但您有两个选项可以保证您始终拥有相同的服务实例。

第一种方式不是在 child 元素中注入服务,而是简单地通过属性绑定它,这将导致以下 Child :

import {ItemService} from 'services/itemService';
import {ApplicationService} from 'services/applicationService';

@Component({
    selector: 'my-view',
    properties: ['itemService : item-service', 'applicationService : application-service']
})
class MyView {
    private itemService : ItemService;
    private applicationService : ApplicationService
    constructor() {
    }
}

您可以在 parent 的模板中将其与以下内容一起使用:

<my-view [item-service]="itemService" [application-service]="applicationService"></my-view>

也就是说,如果您的应用程序组件的构造函数使用 itemService 和 applicationService 作为组件的成员。

另一种方法是使用单例,尽管它不是很干净,但它可以工作,并且可以很容易地供任何组件使用。

最后,根据您的需要,另一种更简洁的方法是仅将您的服务注入逻辑上应该拥有它的组件,然后该组件会将来自服务的数据绑定到 children 使用与我上面相同的语法。如果 children 需要触发服务调用,他们可以发出 parent 可以收听的事件。

我希望我回答了这个问题,如果没有,请尝试描述一下目标是什么。