【问题标题】:Router Resolver not rendering component路由器解析器不渲染组件
【发布时间】:2018-12-05 11:09:48
【问题描述】:

我有这个路由器解析器来从 Google Firestore 中检索数据。我正在尝试使用解析器提前获取数据。当我将调试器置于解析函数时,它会显示从服务器检索到的数据。但它永远不会从 resolve() 方法返回。谁能帮帮我。

路由模块

const routes: Routes = [
    { path: '', component: HomeComponent},
    { path: 'projects', component: ProjectsComponent, resolve: {projectData: ProjectResolver} },
    { path: 'about', component: AboutComponent}
];

应用模块

  providers: [
    ProjectService,
    ProjectResolver
  ],

解析服务

import { Observable } from 'rxjs';
import { ActivatedRouteSnapshot, RouterStateSnapshot, Resolve } from '@angular/router';
import { Injectable } from '@angular/core';
import { ProjectService } from './project.service';
import { map } from "rxjs/operators";
import { Project } from './project.model';

@Injectable()
export class ProjectResolver implements Resolve<Project[]> {

    constructor(private projectService: ProjectService ) {

    }

    resolve(route: ActivatedRouteSnapshot, router: RouterStateSnapshot) : Observable<Project[]> | any{
        return this.projectService.getProjects().pipe(map(project => {
            return project //Debugger shows fetched data(Array of projects)
        }
        ));
    }
}

项目服务

import { AngularFirestore } from 'angularfire2/firestore';
import { Observable } from "rxjs";
import { Injectable } from "@angular/core";

@Injectable()
export class ProjectService {

    constructor(private db: AngularFirestore) {}

    getProjects(): Observable<any> {
        return this.db.collection('currentProjects').valueChanges();
    }

}

** 项目组件(解析器从未加载此组件 )**

import { Component, OnInit, Injectable } from '@angular/core';
import { Project } from './project.model';
import { ActivatedRoute } from '@angular/router';
import { ProjectService } from './project.service';
import { Observable } from 'rxjs';

@Component({
  selector: 'app-projects',
  templateUrl: './projects.component.html',
  styleUrls: ['./projects.component.css']
})

export class ProjectsComponent implements OnInit {

   projects: Project[] = [];

  constructor(private route: ActivatedRoute, private projectService: ProjectService) { 
  }

  ngOnInit() {
      this.route.data.subscribe((data: Project[]) => {
        this.projects = data['projectData'];
      })
  }

}

【问题讨论】:

    标签: angular angular-component-router angular-resolver


    【解决方案1】:

    问题是 Angular Firebase Observable(事件流)永远不会像正常的“observable”那样完成,所以它永远不会解决。我用“take”操作符修改了 Observable 以获取第一项并强制完成。

    this.db.collection('currentProjects').valueChanges().take(1);
    

    变化:

    • 已删除 ProjectService
    • 修改 ProjectResolver
    • 修改项目组件

    我在下面发布了我的问题的解决方案:

    项目解析器(工作)

    export class ProjectResolver implements Resolve<any> {
    
        constructor(private db: AngularFirestore) {
    
        }
    
        resolve(route: ActivatedRouteSnapshot, router: RouterStateSnapshot) : any{
    
            return Observable.from(this.db.collection('currentProjects').valueChanges()
                .do(data => {  
                    return data
                }).take(1))
        }
    }
    

    项目组件(工作)

    export class ProjectsComponent implements OnInit {
    
      private projects: Project[];
    
      constructor(private route: ActivatedRoute) {
    
      }
    
      ngOnInit() {
        this.route.data.subscribe((data) => {
          this.projects = data['projectData'];
        })
      }
    }
    

    【讨论】:

    • 它说我是新用户需要等待2天
    【解决方案2】:

    获取像this.route.snapshot.data 这样的数据而不是this.route.data 并且不需要订阅它

    ngOnInit() {          
       this.projects = this.route.snapshot.data['projectData'];
    }
    

    【讨论】:

    • 你为什么不添加一些小解释,说明为什么它应该起作用以及 OP 的方法有什么问题?
    • 问题是 ngOnInit() 永远不会被调用。它永远不会通过解析器
    • @PopStack 而且您应该在app-routing module 中提供ProjectResolver,而不是app-module。因为那仅用于路由模块。
    • @AmitChigadani 尝试过,但没有任何显示。我可以强制它渲染的唯一方法是通过解析器中的“return Observable.of(null)”。此外,控制台中没有显示任何内容,我正在使用 Augury 进行调试。
    猜你喜欢
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 2017-12-23
    • 2018-07-26
    • 2023-04-03
    • 2019-04-25
    • 2016-02-24
    相关资源
    最近更新 更多