angular - Angular 6 Universal 不等待完成解析器
问题描述
我刚刚安装了 Angular Universal 启动工具包第 6 版并在其中创建了我的组件。该组件应在加载时通过 API 获取用户信息并将其显示以供查看。
问题是 API 结果显示在浏览器中,但未显示在“查看源代码”中。什么是万能的好处呢?!
我的getUserscommponent
代码:
@Component({
selector: 'app-get-users',
templateUrl: './get-users.component.html',
styleUrls: ['./get-users.component.css'],
providers: [HttpClient]
})
export class SportFixturesComponent implements OnInit {
ngOnInit() {
this.route.params.subscribe(params => {
this.route.data.subscribe( data =>{
if (data) {
this.usersList = data;
}else{
this.usersList = [];
}
})
});
}
}
在app.module.ts
代码中:
import { getUserscommponent } from './get-users-component';
import { getUsersResolver } from './get-users-resolver';
@NgModule({
declarations: [
AppComponent,
getUserscommponent
],
imports: [
BrowserModule.withServerTransition({appId: 'my-app'}),
RouterModule.forRoot([
{ path: '', component: HomeComponent, pathMatch: 'full'},
{
path: 'get-users',
component: SportFixturesComponent ,
resolve : {fxResolvedList:getUsersResolver} ,
pathMatch: 'full'
}
]),
TransferHttpCacheModule,
HttpModule,
HttpClientModule
],
providers: [getUsersResolver],
bootstrap: [AppComponent]
})
export class AppModule { }
在get-users-resolver
代码中:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { ActivatedRoute , Router , Resolve , ActivatedRouteSnapshot , RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
@Injectable()
export class getUsersResolver implements Resolve<any>{
constructor(private router: Router,private route: ActivatedRoute,private httpClient:HttpClient){}
resolve(route: ActivatedRouteSnapshot , state: RouterStateSnapshot): Observable<any>|Promise<any>|any {
interface fxInterface{
status : boolean ,
users : any
}
return this.httpClient.post("/api/get-users" , {} , {})
}
}
当我查看例如关于我们的来源时,我看到:
<router-outlet></router-outlet>
<app-about-view>
<h3>About Us text... </h3>
</app-about-view>
</app-root>
但是当我查看源代码时,我会获取用户组件,请参阅:
<router-outlet></router-outlet></app-root>
即使没有
你能帮我解决这个问题吗?
编辑:
经过一些编辑,现在我收到了这个错误:
ERROR { Error: Uncaught (in promise): Error
at resolvePromise (webpack:///./node_modules/zone.js/dist/zone-node.js?:813:31)
at resolvePromise (webpack:///./node_modules/zone.js/dist/zone-node.js?:770:17)
at eval (webpack:///./node_modules/zone.js/dist/zone-node.js?:872:17)
at ZoneDelegate.invokeTask (webpack:///./node_modules/zone.js/dist/zone-node.js?:420:31)
at Object.onInvokeTask (webpack:///./node_modules/@angular/core/fesm5/core.js?:3934:33)
at ZoneDelegate.invokeTask (webpack:///./node_modules/zone.js/dist/zone-node.js?:419:36)
at Zone.runTask (webpack:///./node_modules/zone.js/dist/zone-node.js?:187:47)
at drainMicroTaskQueue (webpack:///./node_modules/zone.js/dist/zone-node.js?:594:35)
at ZoneTask.invokeTask (webpack:///./node_modules/zone.js/dist/zone-node.js?:499:21)
at Server.ZoneTask.invoke (webpack:///./node_modules/zone.js/dist/zone-node.js?:484:48)
at emitTwo (events.js:126:13)
at Server.emit (events.js:214:7)
at parserOnIncoming (_http_server.js:619:12)
at HTTPParser.parserOnHeadersComplete (_http_common.js:115:23)
rejection: [Error],
promise: ZoneAwarePromise { __zone_symbol__state: 0, __zone_symbol__value: [Error] },
zone:
Zone {
_properties: { isAngularZone: true },
_parent:
Zone {
_properties: {},
_parent: null,
_name: '<root>',
_zoneDelegate: [Object] },
_name: 'angular',
_zoneDelegate:
ZoneDelegate {
_taskCounts: [Object],
zone: [Circular],
_parentDelegate: [Object],
_forkZS: null,
_forkDlgt: null,
_forkCurrZone: [Object],
_interceptZS: null,
_interceptDlgt: null,
_interceptCurrZone: [Object],
_invokeZS: [Object],
_invokeDlgt: [Object],
_invokeCurrZone: [Circular],
_handleErrorZS: [Object],
_handleErrorDlgt: [Object],
_handleErrorCurrZone: [Circular],
_scheduleTaskZS: [Object],
_scheduleTaskDlgt: [Object],
_scheduleTaskCurrZone: [Circular],
_invokeTaskZS: [Object],
_invokeTaskDlgt: [Object],
_invokeTaskCurrZone: [Circular],
_cancelTaskZS: [Object],
_cancelTaskDlgt: [Object],
_cancelTaskCurrZone: [Circular],
_hasTaskZS: [Object],
_hasTaskDlgt: [Object],
_hasTaskDlgtOwner: [Circular],
_hasTaskCurrZone: [Circular] } },
task:
ZoneTask {
_zone:
Zone {
_properties: [Object],
_parent: [Object],
_name: 'angular',
_zoneDelegate: [Object] },
runCount: 0,
_zoneDelegates: null,
_state: 'notScheduled',
type: 'microTask',
source: 'Promise.then',
data: ZoneAwarePromise { __zone_symbol__state: 0, __zone_symbol__value: [Error] },
scheduleFn: undefined,
cancelFn: null,
callback: [Function],
invoke: [Function] } }
解决方案
在我的情况下,我通过将检查是否浏览器添加到解析返回来修复它,例如:
// resolver.ts
import { Injectable, PLATFORM_ID, Inject } from '@angular/core';
import { isPlatformBrowser, isPlatformServer } from '@angular/common';
...
...
export class ContentResolverService implements Resolve<Observable<any>> {
constructor(
@Inject(PLATFORM_ID) private platformId: Object
private http: HttpClient,
) {}
resolve() {
return isPlatformBrowser(this.platformId) ? this.http.get('some-url') : null;
}
}
...
推荐阅读
- c++ - 如何包装 std::vector 以在纯 C 中使用
- javascript - 单击按钮 parentElement 执行 2 次
- c# - 即使配置了 DBContext,也没有数据库提供程序错误
- java - RoundingMode.DOWN 的奇怪行为
- apache-spark - spark web gui禁用
- android - react-native-vector-icons/react-native-elements 不起作用
- ios - [NSTaggedPointerString stringValue]:无法识别的选择器发送到 NSString 比较中的实例?
- html - 在 Angular-HTML 中使用 2 个管道
- mysql - 具有正确时间的 MySQL 出勤 IN & OUT 列
- android - 使用edittext将英文字符颜色更改为红色