ngFor 및 Async Pipe Angular 2와 함께 Observable Object의 배열 사용


92

Angular 2에서 Observable을 사용하는 방법을 이해하려고합니다.이 서비스가 있습니다.

import {Injectable, EventEmitter, ViewChild} from '@angular/core';
import {Observable} from "rxjs/Observable";
import {Subject} from "rxjs/Subject";
import {BehaviorSubject} from "rxjs/Rx";
import {Availabilities} from './availabilities-interface'

@Injectable()
export class AppointmentChoiceStore {
    public _appointmentChoices: BehaviorSubject<Availabilities> = new BehaviorSubject<Availabilities>({"availabilities": [''], "length": 0})

    constructor() {}

    getAppointments() {
        return this.asObservable(this._appointmentChoices)
    }
    asObservable(subject: Subject<any>) {
        return new Observable(fn => subject.subscribe(fn));
    }
}

이 BehaviorSubject는 다른 서비스에서 새 값으로 푸시됩니다.

that._appointmentChoiceStore._appointmentChoices.next(parseObject)

나는 그것을 표시하려는 구성 요소에서 관찰 가능한 형태로 구독합니다.

import {Component, OnInit, AfterViewInit} from '@angular/core'
import {AppointmentChoiceStore} from '../shared/appointment-choice-service'
import {Observable} from 'rxjs/Observable'
import {Subject} from 'rxjs/Subject'
import {BehaviorSubject} from "rxjs/Rx";
import {Availabilities} from '../shared/availabilities-interface'


declare const moment: any

@Component({
    selector: 'my-appointment-choice',
    template: require('./appointmentchoice-template.html'),
    styles: [require('./appointmentchoice-style.css')],
    pipes: [CustomPipe]
})

export class AppointmentChoiceComponent implements OnInit, AfterViewInit {
    private _nextFourAppointments: Observable<string[]>

    constructor(private _appointmentChoiceStore: AppointmentChoiceStore) {
        this._appointmentChoiceStore.getAppointments().subscribe(function(value) {
            this._nextFourAppointments = value
        })
    }
}

다음과 같이 뷰에 표시하려는 시도 :

  <li *ngFor="#appointment of _nextFourAppointments.availabilities | async">
         <div class="text-left appointment-flex">{{appointment | date: 'EEE' | uppercase}}

그러나 availabilities는 아직 관찰 가능한 객체의 속성이 아니므로 오류가 발생합니다.

export interface Availabilities {
  "availabilities": string[],
  "length": number
}

비동기 파이프 및 * ngFor를 사용하여 관찰 가능한 객체에서 비동기 적으로 배열을 표시하려면 어떻게해야합니까? 내가 얻는 오류 메시지는 다음과 같습니다.

browser_adapter.js:77 ORIGINAL EXCEPTION: TypeError: Cannot read property 'availabilties' of undefined

실제 오류 메시지는 무엇입니까?
Günter Zöchbauer

오류 추가 편집
C. 컨스

최신 각도-RC1과 구문은*ngFor="let appointment of _nextFourAppointments.availabilities | async">
자간 나트

이것은 사실이지만 오류를 일으키는 것은 아닙니다. 그것은 단순히 경고를 던집니다.
C. 컨스

3
어딘가에 오타가 있다고 생각합니다. 이 오류는 말한다 availabilties가 있어야하는 동안availabilities
이반 Sivak

답변:


153

여기에 예가 있습니다.

// in the service
getVehicles(){
    return Observable.interval(2200).map(i=> [{name: 'car 1'},{name: 'car 2'}])
}

// in the controller
vehicles: Observable<Array<any>>
ngOnInit() {
    this.vehicles = this._vehicleService.getVehicles();
}

// in template
<div *ngFor='let vehicle of vehicles | async'>
    {{vehicle.name}}
</div>

: 내 get 함수는하지만 주제를 반환 public _appointmentChoices: Subject<any> = new Subject() getAppointments() { return this._appointmentChoices.map(object=>object.availabilities).subscribe() } : 나는 내가 오류를 얻을 동일하게 설정하면 컨트롤러, browser_adapter.js:77Error: Invalid argument '[object Object]' for pipe 'AsyncPipe'내가 어떻게 관측으로 주제를 설정합니까?
C. Kearns

public _appointmentChoices: Subject<any> = new Subject() getAppointments() { return (this._appointmentChoices.map(object=>object.availabilities).asObservable()) } } 이것은 나에게 오류를 준다 : property asObservable does not exist on type observable, 그러나 _appointmentChoices는 Subject?
C. Kearns

벌써 관찰 할 수있었습니다! 구독 만하면 됐어요!
C. Kearns

주제를 통합하는 데 추가 문제가있었습니다. 다음은 Observable과 주제를 사용하는 StackBlitz입니다. stackblitz.com/edit/subject-as-observable-list-example
IceWarrior353

12

이 게시물을 우연히 발견 한 사람도 있습니다.

나는 올바른 방법이라고 믿습니다.

  <div *ngFor="let appointment of (_nextFourAppointments | async).availabilities;"> 
    <div>{{ appointment }}</div>
  </div>

1

나는 당신이 찾고있는 것이 이것이라고 생각합니다

<article *ngFor="let news of (news$ | async)?.articles">
<h4 class="head">{{news.title}}</h4>
<div class="desc"> {{news.description}}</div>
<footer>
    {{news.author}}
</footer>


1

배열이 없지만 observable이 객체의 스트림 임에도 불구하고 배열처럼 사용하려고하면 기본적으로 작동하지 않습니다. 객체를 삭제하는 것이 아니라 옵저버 블에 객체를 추가하는 데에만 관심이 있다고 가정하고 아래에서이 문제를 해결하는 방법을 보여줍니다.

소스가 BehaviorSubject 유형 인 Observable을 사용하려는 경우이를 ReplaySubject로 변경 한 다음 컴포넌트에서 다음과 같이 구독하십시오.

구성 요소

this.messages$ = this.chatService.messages$.pipe(scan((acc, val) => [...acc, val], []));

HTML

<div class="message-list" *ngFor="let item of messages$ | async">

scan교환 원 대신 사용할 수 있습니다.pipe(toArray())
MotKohn

자신을 만들 때 또 다른 함정은를 Subject호출하지 않는 것 complete()입니다. 누산기는 실행되지 않습니다.
MotKohn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.