0

我是 Angular 的新手。我正在尝试在我的代码中使用解析器。我已经定义了使用解析器的路线。这是我的路线。

{
   path: '',
   component: AppComponent,
   resolve: {
   post: ResolverService
   }
}

然后我创建一个解析器服务。

import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Post } from './post.data';


@Injectable({
  providedIn: 'root'
})

export class ResolverService implements Resolve<any> {

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    const post = {
      userId: 101,
      id: 101,
      title: "abc",
      body: "xyz"
    }
    return post;
  }
}

这个解析器没有返回我试图从我的组件访问的帖子数据。这是我的组件类代码。

export class AppComponent {
  title = 'angular-resolver';
  page = 1;
  pageSize = 10;

  posts;
  constructor(private route: ActivatedRoute, private postService: PostService) {
  
    this.route.data.subscribe(data => console.log(data));
    
  }
}

这里 console.log 返回一个空数组。我认为它应该返回我在解析器类中指定的数据。非常需要一些帮助。谁能告诉我发生了什么?提前致谢。

4

1 回答 1

1

我认为这是该Resolve模式的边缘情况,您不能在引导组件(AppComponent)上使用它,因为它不是实际路线,但应用程序从它开始。

如果你想为你预加载一些东西,AppComponent你可以使用APP_INITIALIZER,你可以指定任意数量的它们,并且应用程序在它们全部解决之前不会启动。他们通过从他们那里返回 a 来解决Promise

应用模块

export function resolveBeforeAppStarts(yourDataService: YourDataService) {
  return () => yourDataService.load().toPromise();
}

@NgModule({
  imports: [BrowserModule, FormsModule],
  declarations: [AppComponent],
  providers: [
    {
      provide: APP_INITIALIZER,
      useFactory: resolveBeforeAppStarts,
      deps: [YourDataService],
      multi: true
    }
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}

你的数据服务

@Injectable({ providedIn: "root" })
export class YourDataService {
  demoOnly: { userId: number; id: number; title: string; body: string };

  load = () =>
    of({
      userId: 101,
      id: 101,
      title: "abc",
      body: "xyz"
    }).pipe(
      delay(500),
      tap(x => (this.demoOnly = x))
    );
}

应用组件

export class AppComponent {
  data = this.yourDataService.demoOnly;
  constructor(private yourDataService: YourDataService) {}
}

演示:

https://stackblitz.com/edit/angular-ivy-txyfhd?file=src/app/your-data.service.ts

于 2021-02-03T19:31:28.977 回答