我有一个cookie-service
负责显示一个cookie横幅接受网站cookie。如果用户接受cookie,它也用于设置和获取cookie。
我的问题是,如果我没有在任何组件中包含该服务,cookie横幅也不会显示。我也尝试了不同的方法来提供它的模块,但也没有工作。有没有办法在angular中包含一个服务,即使它没有被显式地包含在任何组件中?
更新我尝试按照建议注册服务,但是控制台日志还是不显示
<共享模块/strong>
@NgModule({
declarations: [
// ...
],
exports: [
// ...
],
imports: [
// ...
providers: [
CookieService,
// ...
],
})
export class SharedModule {
}
改变可注射部分
@Injectable({
providedIn: 'root'
})
@Injectable()
export class CookieService {
constructor() {
console.log('cookie service is alive');
}
// ...
}
EDIT
作为一种解决方法,创建一个指令,并在应用的根组件中使用它。在这里注入你的服务,你就完成了。你也可以将服务中的逻辑移到该指令中。这样你就不会因为无用的注入而污染你的组件。或者,正如另一个用户建议的那样,只是将它注入根组件并完成它(但一定要留下评论,说明为什么你只是在那里注入一些东西,然后不使用它)
原来我猜你的服务被Webpack彻底颠覆了。为了防止这种情况,从@Injectable
装饰器中删除providedIn
,并将您的服务类放入@NgModule
的providers
数组中。
以下是文档中的相关部分:
在@Injectable()元数据中注册提供商还允许Angular通过从编译后的应用中删除未使用的服务来优化应用,这个过程被称为摇树。
使用@Injectable() providedIn属性比使用@NgModule() providers数组更可取,因为有了@Injectable() providedIn,优化工具可以执行摇树操作,移除应用中不使用的服务,从而得到更小的包。
只需将其注入您的AppComponent
。它看起来应该像这样:
export class AppComponent {
constructor(cookieService: CookieService) { }
// ...
}