- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
情况
我一直在尝试找到一种方法来实例化一个服务,该服务将纯粹位于“后台”并监听事件(并做一些事情)——我希望在应用程序初始化时创建它,并被遗忘.
不幸的是,我需要在组件中使用依赖注入(inject),以便实例化服务 - 我采用的大多数路径都使用 AppComponent
的构造函数。
不过,我不会直接与服务交互(调用方法/属性),并且希望将其排除在与它没有任何直接关系的其他组件/服务之外。
服务
服务和其中的逻辑非常简单。我的服务基于 Dynamic page titles in Angular 2教程。
该服务将监听 NavigationEnd
来自 Router
的事件,抢到ActivatedRoute
,然后使用路由的数据来设置页面标题。
与教程中的示例不同,我创建了自己的服务,而不是将逻辑放在 AppComponent
中。 ;我想让我的关注点分离保持领先。
页面标题.service.ts:
import { Injectable } from '@angular/core';
import { Router, NavigationEnd, ActivatedRoute } from '@angular/router';
import { Title } from '@angular/platform-browser';
import { filter, map, mergeMap } from 'rxjs/operators';
@Injectable()
export class PageTitleService {
constructor(
router: Router,
activatedRoute: ActivatedRoute,
titleService: Title
) {
router.events
.pipe(
filter((event) => event instanceof NavigationEnd),
map(() => activatedRoute),
map((route) => {
while (route.firstChild) {
route = route.firstChild;
}
return route;
}),
filter((route) => route.outlet === 'primary'),
mergeMap((route) => route.data)
)
.subscribe((routeData) => titleService.setTitle(routeData['title']));
}
}
显然,服务本身将依赖依赖注入(inject)来使用
Router
,
ActivatedRoute
, 和
Title
服务。
app.component.ts
:
export class AppComponent implements OnInit {
constructor(
pageTitleService: PageTitleService, // inject the service to instantiate it
// ... other services
) { }
ngOnInit() {
// do stuff with other services, but not the pageTitleService
}
}
问题是,如果可能的话,我想避免这样做。
app-load.module.ts
,在加载应用程序的其余部分之前进行一些前期初始化:
import { APP_INITIALIZER, NgModule } from '@angular/core';
import { OrganisationService } from './core/organisation/organisation.service';
export function initApp(organisationService: OrganisationService) {
return () =>
organisationService
.initialize()
.then(() => window.document.documentElement.classList.remove('app-loading'));
}
@NgModule({
imports: [],
declarations: [],
providers: [
OrganisationService,
{ provide: APP_INITIALIZER, useFactory: initApp, deps: [OrganisationService], multi: true }
]
})
export class AppLoadModule { }
我可以实例化
PageTitleService
在这里,某处?
最佳答案
只是观察一下为什么注入(inject)一个组件(App 组件)不会是一个坏主意:
init
服务中的方法,该方法将从应用程序组件调用,以便它可以开始监听路由器事件并更新标题。这使得它非常必要,也很明确,如果需要,您可以将调用此 init 方法转移到其他组件。 关于angular - 创建一个单例服务而不需要在 Angular 7 中注入(inject)它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56541750/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!