4

私はデータモデルを持っています (アプリケーション内の単一インスタンスである必要があります)

export class Computer {
    model: string;
    serial: string;
    completed: boolean = false;
}

最善の方法は、注射可能なサービスで返却することだと思います。

@Injectable()
export class DataService {

    getComputer(): Observable<Computer> {
        let c = new Computer();
        c.model = 'Quite Good Computer 455';
        c.serial = '344-344-455-555';
        c.ompleted = true;
        ...
    }
}

CoreModule に配置する必要があります。

Observable を返すために DataService.getComputer() を実装する方法は? 直前に作成したc ...

編集

このgetComputer()方法では、ネットワーク遅延をエミュレートする必要があります - タイムアウトを 2 秒に設定します。以前は使用していましたがPromise、この機能は次のとおりです。

getComputer(): Promise<Computer> {
    return new Promise<Computer>(resolve =>
        setTimeout(() => resolve(this.createComputer()), 2000) // 2 seconds
    );
}

private createComputer(): Computer {
    let c = new Computer();
    c.model = 'Quite Good Computer 455';
    c.serial = '344-344-455-555';
    c.ompleted = true;
    return c;
}

次のように消費されました。

ngOnInit() {
    this.dataService.getComputer().then(
        data => this.computer = data
    );
}

これを Observables を使用するように変換し、後で inot コア モジュールを配置します。

GünterZöchbauerの回答の後、次のことを試しました

getComputer(): Observable<Computer> {
    let res = new BehaviorSubject<Computer>();
    return <Observable<Computer>>res.asObservable();
}

しかし、VSClet res ...はエラー メッセージのある行を強調表示します[ts] Supplied parameters do not match any signature of call target. (alias) new BehaviorSubject<T>(_value: T): BehaviorSubject<T>。から輸入BehaviorSubjectしましrxjs/rxた。

編集

Günter Zöchbauer からの別のメモの後、サービス クラス コードを変更しました

export class DataServiceMock {
    private computerObs: Observable<Computer>;
    constructor() {
        let s = new BehaviorSubject<Computer>();
        this.computerObs = s.asObservable(); 
    }  

    getComputer(): Observable<Computer> {
        return this.computerObs;
    }

言及されたエラーはここにあります: let s = new BehaviorSubject<Computer>();. このシナリオでは、2 秒の遅延でComputer(を使用して) インスタンスをストリームに追加する方法もわかりません。next()ngInit

4

1 に答える 1

2
getComputer(): Observable<Computer> {
    let c = new Computer();
    c.model = 'Quite Good Computer 455';
    c.serial = '344-344-455-555';
    c.ompleted = true;
    return Observable.of(c);
}

アップデート

private computer = new BehaviorSubject<Computer>();

computer$ = this.computer.asObservable();

// called when computer changes
updateComputer(Computer c) {
  this.computer.next(c);
}

呼び出し元によって使用される

this.dataService.computer$.subscribe(...)
于 2016-09-05T09:22:58.293 に答える