开发者问题收集

Angular,数组上的订阅不起作用

2018-02-24
6444

我正在做一个 alert.service。我的服务包含一个名为 Alert 的模型数组。

这是 alert.service

@Injectable()
export class AlertService {

  private queue: Alert[] = new Array<Alert>();

  constructor() { }

  getInstance() : Observable<Alert[]> {
    return of(this.queue);
  }

  push(type: string, title: string, message: string) {
    let alert = new Alert(type, title, message);

    this.queue.push(alert);
    window.setTimeout(_ => {
      this.pop();
    },3000);
  }

  pop() {
    this.queue.pop();
  }
}

从我的 alert.component,我调用此服务并订阅队列的可观察对象:

export class AlertComponent implements OnInit {

  public alert: string = `
  <div class="alert [type]">
    <span>[title]</span>
    <p>[message]</p>
  </div>`;

  constructor(private alertService: AlertService) { }

  ngOnInit() {
    this.alertService.getInstance().subscribe(val => {
      console.log(val);
    });
  }

  success() {
    this.alertService.push('error', 'ninja', 'hahahahahahah hahhahaha hahah hah');
  }

}

在我的模板中,我单击一个按钮,该按钮触发方法 success() (被调用)。

但 console.log(val) 只返回一次值。这是我的队列服务数组实例化时的值。

我做错了什么?

感谢您的帮助!

1个回答

最后,

我管理自己以在数组上使用 BehaviorSubject。

@Injectable()
export class AlertService {

  private queue: Alert[] = new Array<Alert>();
  private behaviorSubjectQueue: BehaviorSubject<Alert[]> = new BehaviorSubject<Alert[]>(this.queue);

  constructor() {
  }

  getInstance() {
    return this.behaviorSubjectQueue;
  }

  push(type: string, title: string, message: string) {
    let alert = new Alert(type, title, message);

    this.queue.push(alert);
    this.behaviorSubjectQueue.next(this.queue);
    window.setTimeout(_ => {
      this.pop();
    },3000);
  }

  pop() {
    this.queue.pop();
    this.behaviorSubjectQueue.next(this.queue);
  }
}

组件保持不变,但每次推送和弹出操作时都会收到通知。

谢谢大家的帮助!

Yoann Picquenot
2018-02-24