【问题标题】:Need help accessing variable from Service in Angular 2需要帮助从 Angular 2 中的服务访问变量
【发布时间】:2018-06-03 09:20:34
【问题描述】:

将用户上一页的 URL id 传递给我可以在对话框中引用的服务。

issuer.service.ts

import { Injectable, EventEmitter } from '@angular/core';
import { Observable, of } from 'rxjs';
import { BehaviorSubject } from 'rxjs';

@Injectable()
export class IssuerService {


private urlidSource = new BehaviorSubject<string>('');
currentUrlid = this.urlidSource.asObservable();
public onChange: EventEmitter<string> = new EventEmitter<string>();

  constructor () {
  }

  changeUrlid(urlid: string) {
    this.currentUrlid = of(urlid);
    this.onChange.emit(urlid);
  }

  getUrlid(currentUrlid: string) {
    return this.currentUrlid;
  }


}

具有我想要的 URL id 的页面 (dashboard.component.ts)

import { IssuerService } from './../../issuer.service';
import { ActivatedRoute } from '@angular/router';
import { Router } from '@angular/router';
urlid: string;
  constructor(
    private route: ActivatedRoute,
    private router: Router,
    private issuerService: IssuerService,
    public dialog: MatDialog
  ) {}

newUrlid() {
  this.issuerService.changeUrlid(this.route.snapshot.paramMap.get('id'));
  console.log(this.urlid);
}

  ngOnInit() {
    // Get URL ID
    this.issuerService.onChange.subscribe(urlid => this.urlid = urlid);
    this.newUrlid();
}

组件我要读取的值:

    import { ActivatedRoute } from '@angular/router';
    import { Router } from '@angular/router';
    import { IssuerService } from './../../issuer.service';

        urlid: string;

        constructor(
          private route: ActivatedRoute,
          private router: Router,
          private issuerService: IssuerService,
          public dialog: MatDialog
        ) {}

  ngOnInit() {
 this.issuerService.onChange.subscribe(urlid => {
           this.urlid = urlid;
           console.log(this.urlid);
   });

  }

所以目前当我访问我的仪表板页面时,它会显示正确的值 2。我的目标是,当用户访问任何页面时,我可以读取此值 2。如何访问此值?上面的代码有效,我的 Header 显示 2 但仅在仪表板页面上时才显示。无论用户在哪个页面上,我都需要它显示 2。

【问题讨论】:

  • 为什么你在这里传递 getUrlid() id?您可以使用相同的方法
  • 如果我要从不同的组件 (home.component.ts) 访问此服务,我将如何显示“2”(urlid 中包含的值)。

标签: javascript html angular


【解决方案1】:

你可以看到这个example,它是修改列表:

  • 使用 queryPamas 获取查询字符串,而不是参数(DashboardComponent)

  • 使用ReplaySubject(1)返回最后一个urlId;它没有默认值,只返回前一个值(IssuerService)

  • 从 getUrlid 获取 observable 并在想要显示 url id 的组件中订阅它

export class IssuerService {


  private urlidSource = new ReplaySubject<string>(1);

  constructor() {
  }

  changeUrlid(urlid: string) {
    this.urlidSource.next(urlid);
  }

  getUrlid() {
    return this.urlidSource;
  }

}

export class DashboardComponent implements OnInit {

  urlid: string;
  constructor(
    // private route: ActivatedRoute,
    private router: Router,
    private issuerService: IssuerService,
    // public dialog: MatDialog
  ) { }

  newUrlid() {
    // Get URL ID
    this.route.queryParams.subscribe((queryParam) => {
      const id = queryParam['id'];
      if (!id) {
        return;
      }
      this.issuerService.changeUrlid(id);
    });
  }

  ngOnInit() {
    this.newUrlid();

    this.issuerService.getUrlid().subscribe(urlid => {
      this.urlid = urlid;
    });
  }

}

export class HelloComponent implements OnInit {
  urlid;
  constructor(
    private issuerService: IssuerService
  ) { }

  ngOnInit() {
    this.issuerService.getUrlid().subscribe(urlid => {
      this.urlid = urlid;
    });
  }
}

【讨论】:

    【解决方案2】:

    您的 get 方法不需要参数,因为您已经在服务中获得了值,

      getUrlid() {
        return this.currentUrlid;
      }
    

    您可以使用检索第二个组件中的值,如下所示,

    this.issuerService.currentUrlid.subscribe((value: string) => {
             this.urlid = value;
    }
    

    【讨论】:

    • 我试过这个然后把 console.log(this.issuerService.getUrlid());在我的代码中。它不返回值,它返回一个 Observable "Observable {_isScalar: false, source: BehaviorSubject}"
    • 哦忘了它是可观察的,检查更新的
    • 对不起,我没用 --- 我还是很新。我收到以下错误:[ts] Property 'asObservable' does not exist on type 'Observable'.
    • @user68288 你试过this.issuerService.getUrlid().subscribe(urlid =&gt; { this.urlid = urlid; console.log(this.urlid); });
    • asObservable 是 Subject 的类型不可观察,我想你可以试试this.issuerService.currentUrlid.subscribe(...)this.issuerService.onChange.asObservable().subscribe(...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2016-01-12
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    相关资源
    最近更新 更多