【发布时间】:2018-06-18 02:42:41
【问题描述】:
我有一个 TttService 服务。它具有细胞属性。这是一个对象数组。它仅在客户端上更改。一个组件订阅其更改,另一个组件更改它。我想让 makeMove() 更改单元格数组中所需对象的属性之一,并且在单元格上签名的组件应该获得这些更改。这如何实现?
如果在方法 makeAMove() 中生成 console.log(this.cells) - 将是空的。在这种情况下,通过 initCells() 方法订阅单元格的组件第一次被修改。
我的服务
import { Injectable } from '@angular/core';
import { TttServiceInteface } from '../interfaces/ttt-service-inteface';
import { CellInteface } from '../interfaces/cell-interface';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { asObservable } from './asObservable';
@Injectable()
export class TttService {
public cells: BehaviorSubject<CellInteface[]> = new BehaviorSubject([]);
constructor() { }
initCells(fieldSize: number, fieldWidth: number): Observable<CellInteface[]> {
const cells = [];
for (let i = 0; i < fieldSize * fieldSize; i++) {
cells.push({
width: fieldWidth,
height: fieldWidth,
id: i
});
}
this.cells.next(cells);
return this.cells;
}
getCells() {
return asObservable(this.cells);
}
makeAMove(id: number) {
this.getCells()
.subscribe((c: Array<CellInteface>) => {
c.forEach(cell => {
if (cell.id === id && !cell.id) {
cell.value = 1;
}
});
this.cells.next(c);
});
}
我的组件
ngOnInit() {
const border = (window.screen.availHeight - 150);
this.fieldSize = 5;
this.border = border + 100;
this.tttService
.initCells(this.fieldSize, border / this.fieldSize)
.subscribe(cells => {
console.log(cells);
this.cells = cells;
});
}
【问题讨论】:
标签: angular rxjs behaviorsubject