Angular RC6 - 使用自己的数据创建可注射服务

时间:2016-09-05 09:21:04

标签: angular angular2-observables

我有一个数据模型(应该是应用程序中的单个实例)

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。

如何实现DataService.getComputer()以返回Observable? 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();
}

但VSC突出显示行let res ...,错误消息为[ts] Supplied parameters do not match any signature of call target. (alias) new BehaviorSubject<T>(_value: T): BehaviorSubject<T>。我从BehaviorSubject导入了rxjs/rx

修改

在GünterZö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>();。在这种情况下,我也不知道如何将Computer实例添加到流(使用next())延迟2秒 - 我将其放入ngInit

1 个答案:

答案 0 :(得分: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(...)