Angular 2 中的单个服务实例
Single instance of a service in Angular 2
首先,我知道这个答案以前发布过很多次,但我无法完成我的工作,也许这里有人可以提供帮助。
我正在使用 angular-cli beta 5 生成一个新项目。
我使用 angular 2 rc1.
我有一个 class 名为 ApplicationConfiguration <- 这个我想创建一个实例,遍历我的应用程序的每个组件。
在我的 main.ts 我有:
bootstrap(MyProjWebAppComponent, [ROUTER_PROVIDERS, HTTP_PROVIDERS, ApplicationConfiguration, provide(Http, {
useFactory: (xhrBackend: XHRBackend, requestOptions: RequestOptions, router: Router, appConfig: ApplicationConfiguration) => new HttpServiceLayer(xhrBackend, requestOptions, router, appConfig),
deps: [XHRBackend, RequestOptions, Router, ApplicationConfiguration]
})]);
我的应用程序配置class:
@Injectable()
export class ApplicationConfiguration {
constructor() {
console.log('aaa');
}
}
以及我如何注入 ApplicationConfiguration 的示例组件:
import { ApplicationConfiguration } from '../..//services/application-configuration/application-configuration';
@Component({
moduleId: module.id,
selector: 'app-log-in',
templateUrl: 'log-in.component.html',
styleUrls: ['log-in.component.css'],
directives: [ROUTER_DIRECTIVES],
providers: [ApplicationConfiguration, LogInService]
})
export class LogInComponent implements OnInit {
constructor(private _service: LogInService, private appConfig: ApplicationConfiguration, private _router: Router) { }
}
我不知道我做错了什么,但每次我导航到一个新页面并注入我的 class,我都可以看到正在创建一个新实例
如果您需要任何其他信息,请告诉我。
非常感谢这个问题的解决方案。
如果您只需要一个实例,则不应多次提供 class。 Angular DI 为每个提供者维护一个实例。
因此将 ApplicationConfiguration
从 LogInComponent
删除到
providers: [LogInService]
我不明白为什么您的自定义需要工厂 HttpServiceLayer
。这应该做同样的事情:
更新(>=RC.5)
@NgModule({
declarations: [MyProjWebAppComponent],
bootstrap: [MyProjWebAppComponent],
imports: [BrowserModule, RouterModule, HttpModule],
providers: [
ApplicationConfiguration,
{provide Http: useClass: HttpServiceLayer})
]
});
原创
bootstrap(MyProjWebAppComponent, [
ROUTER_PROVIDERS,
HTTP_PROVIDERS,
应用配置,
提供(Http,{useClass:HttpServiceLayer})
]);
首先,我知道这个答案以前发布过很多次,但我无法完成我的工作,也许这里有人可以提供帮助。
我正在使用 angular-cli beta 5 生成一个新项目。 我使用 angular 2 rc1.
我有一个 class 名为 ApplicationConfiguration <- 这个我想创建一个实例,遍历我的应用程序的每个组件。
在我的 main.ts 我有:
bootstrap(MyProjWebAppComponent, [ROUTER_PROVIDERS, HTTP_PROVIDERS, ApplicationConfiguration, provide(Http, {
useFactory: (xhrBackend: XHRBackend, requestOptions: RequestOptions, router: Router, appConfig: ApplicationConfiguration) => new HttpServiceLayer(xhrBackend, requestOptions, router, appConfig),
deps: [XHRBackend, RequestOptions, Router, ApplicationConfiguration]
})]);
我的应用程序配置class:
@Injectable()
export class ApplicationConfiguration {
constructor() {
console.log('aaa');
}
}
以及我如何注入 ApplicationConfiguration 的示例组件:
import { ApplicationConfiguration } from '../..//services/application-configuration/application-configuration';
@Component({
moduleId: module.id,
selector: 'app-log-in',
templateUrl: 'log-in.component.html',
styleUrls: ['log-in.component.css'],
directives: [ROUTER_DIRECTIVES],
providers: [ApplicationConfiguration, LogInService]
})
export class LogInComponent implements OnInit {
constructor(private _service: LogInService, private appConfig: ApplicationConfiguration, private _router: Router) { }
}
我不知道我做错了什么,但每次我导航到一个新页面并注入我的 class,我都可以看到正在创建一个新实例
如果您需要任何其他信息,请告诉我。
非常感谢这个问题的解决方案。
如果您只需要一个实例,则不应多次提供 class。 Angular DI 为每个提供者维护一个实例。
因此将 ApplicationConfiguration
从 LogInComponent
删除到
providers: [LogInService]
我不明白为什么您的自定义需要工厂 HttpServiceLayer
。这应该做同样的事情:
更新(>=RC.5)
@NgModule({
declarations: [MyProjWebAppComponent],
bootstrap: [MyProjWebAppComponent],
imports: [BrowserModule, RouterModule, HttpModule],
providers: [
ApplicationConfiguration,
{provide Http: useClass: HttpServiceLayer})
]
});
原创 bootstrap(MyProjWebAppComponent, [ ROUTER_PROVIDERS, HTTP_PROVIDERS, 应用配置, 提供(Http,{useClass:HttpServiceLayer}) ]);