我有一个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);
});
}
&#13;
我的组件
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;
});
}
&#13;
答案 0 :(得分:0)
试试这个。
在您的服务中。
private cells: BehaviorSubject<CellInteface[]> = new BehaviorSubject([]);
private arrayOfCells: CellInterface[];
public initCells(fieldSize: number, fieldWidth: number): void {
for (let i = 0; i < fieldSize * fieldSize; i++) {
this.arrayOfCells.push({
width: fieldWidth,
height: fieldWidth,
id: i
});
}
this.cells.next(this.arrayOfCells);
}
public getCells(): Observable<CellInteface[]> {
return this.cells.asObservable();
}
public makeAMove(id: number) {
this.arrayOfCells.forEach(cell => {
if (cell.id === id && !cell.id) {
cell.value = 1;
}
});
this.cells.next(this.arrayOfCells);
}
在订阅组件中。
constructor(private tttService: YourService ) {
this.tttService.getCells().subscribe((cells: CellInteface[]) => {
// you can use cells variable in here.
});
}
在数据设置组件中。
constructor(private tttService: YourService ) {
const border = (window.screen.availHeight - 150);
this.fieldSize = 5;
this.border = border + 100;
this.tttService.initCells(this.fieldSize, border / this.fieldSize);
//or you can call the makeAMove method.
this.tttService.makeAMove(id).subscribe((res) => {
// you get the updated cell array as res
});
}