【问题标题】:Angular 2 passing objects when routingAngular 2在路由时传递对象
【发布时间】:2017-08-17 11:38:36
【问题描述】:

我试图在路由时在页面之间传递一个对象(数组)。为此,我完全按照this answer 所说的做了,但这对我不起作用。

服务

@Injectable ()
export class ReportService extends HttpService {

    public selectedReports: any[] = [];

    public setSelectedReports (id: string, value: any) {
        this.selectedReports[id] = value;
    }

    public removeSelectedReports (id: string) {
         delete this.selectedReports[id];
    }
}

家长

import { ReportService } from './';

@Component({
  providers: [ReportService]
})

export class ReportComponent {
  constructor (private reportService: ReportService) {}
}

孩子 1

import { ReportService } from '../';
@Component({
  template: '<a [routerLink]="['stats']">Stats</a>'
})

export class ReportHomeComponent {

  constructor (private reportService: ReportService) {
    reportService.setSelectedReports (1, 'hello')
  }
}

孩子 2

import { ReportService } from '../';

@Component({
})

export class ReportStatsComponent {

  constructor (private reportService: ReportService) {
    console.log(reportService.selectedReports)
  }
}

如果我点击第一个孩子中的a,我会被重定向到第二个孩子。在换页之前,selectedReports[] 被填满。换页后,它是空的。我错过了什么吗?

我知道以前有人问过这个问题,但我还是决定在问题顶部链接中给出的答案的评论部分提出请求。

【问题讨论】:

    标签: angular oop typescript routes


    【解决方案1】:

    您可能以两种不同的方式导入服务。在您使用的父组件中:

    @Component({
      providers: [ReportService]  //<--unique instance injected into this component
    })
    

    这会创建一个新实例并将其注入到此组件和子组件树中。

    如果您在@NgModuleproviders 数组中也指定了ReportService,那么孩子们可能会从那里获取他们的实例。

    对于这样的共享服务,我建议只将服务添加到@NgModule 中的providers 数组中。这为该模块中的所有组件提供了一个实例。而组件装饰器中的 providers 数组为该组件提供了一个唯一的实例。

    @NgModule({
      imports: [
        ...
      ],
      declarations: [
        ...
      ],
      providers: [ReportService],  //<--inject service here to be global to module
      bootstrap: [AppComponent]
    })
    

    【讨论】:

    • 我已将提供程序替换为模块,但selectedReports 仍然为空。父模块现在是唯一提供它的位置。
    • 在我看来,如果服务在修改数组后提供了一个空数组,那么它或服务在路由更改后再次被构造。如果删除 = [] 并仅在未定义的 setSelectedReports 中创建数组,会发生什么情况?
    • selectedReports 在加载新页面时未定义
    • 嗯....我在我的一个应用程序中的几个地方都在做同样的事情,没有任何问题。服务被创建了不止一次,或者正在清除它,例如重新启动应用程序的整个页面刷新。
    • 我在imports@Injectable () 之间放置了一个console.log,它只在加载第一页时调用。重定向到第二页时找不到日志。
    猜你喜欢
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2016-09-06
    • 2016-09-21
    • 2016-08-27
    • 2017-02-28
    • 2017-04-26
    相关资源
    最近更新 更多