简要总结:当通过集线器接收到新数据(或至少只是集合中的任何更改)时,我无法弄清楚如何执行该方法 更多细节:有一个集线器接收数据(单元格)的集合。该集线器(shot-hub 文件)用于渲染这些单元的服务(battlefield-service 文件)。问题是更新后,还需要调用这个集合的所有单元格的方法。来自以下集线器和服务的代码:
射击中心
import { Injectable } from '@angular/core';
import { HubConnection, HubConnectionBuilder } from '@aspnet/signalr';
import { Cell } from 'src/app/models/cell';
import { BehaviorSubject, Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class ShotHubService {
private hub: HubConnection;
public subject: BehaviorSubject<Cell[]>; //эту коллекцию я планирую передавать (но еще не понимаю с каким типом и как ее передать)
constructor() {
this.subject = new BehaviorSubject(Array<Cell>());
this.hub = new HubConnectionBuilder().withUrl('http://localhost:54708/shothub').build();
this.hub.start().then(() => console.log('Hub connected'))
.catch(err => console.error(`Error for hub connection ${err}`));
this.hub.on('getShots', (cells: Cell[]) => {
this.subject.next(cells);
});
}
public receiveShots(): Observable<Cell[]> {
return this.subject.asObservable();
}
战场服务
import { ShotHubService } from './shot-hub.service';
import { FormGroup } from '@angular/forms';
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Cell } from 'src/app/models/cell';
import { Ship } from 'src/app/models/ship';
import { CellStatus } from 'src/app/models/cellStatus';
import { Subscription } from 'rxjs/internal/Subscription';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class BattlefieldService {
shipField: Cell[][];
ships: Ship[];
shots: Cell[];
subscription: Subscription;
N = 10;
constructor(private http: HttpClient, public shotHub: ShotHubService) {
this.shipField = this.createField();
this.ships = new Array<Ship>();
this.shots = shotHub.shotsEnemy; //тут будет присвоено начальное значение коллекции выстрелов, затем по обновлению это коллекции должен (по моей логике) выполняться код метода drawShot для всех элементов
}
private createField(): Cell[][] {
let field = [];
for (let i = 0; i < this.N; i++) {
field[i] = [];
for (let j = 0; j < this.N; j++) {
field[i][j] = new Cell(i, j, CellStatus.None);
}
}
return field;
}
getShipField(): Cell[][] {
return this.shipField;
}
private drawShip(ship: Ship) {
ship.cells.forEach(cell => {
this.shipField[cell.y][cell.x].status = cell.status;
});
}
// этот метод должен отрисовать полученные выстрелы
private drawShot(shot: Cell) {
this.shipField[shot.y][shot.x].status = shot.status;
}
}
再做
subsribe一个:subscribe让我给你一个更详细的答案。我在集线器上没有成功,但问题的本质不是集线器。其实本质是在战场服务中我们创建了一个变量,
subscription: Subscription;然后在构造函数中我们编写如下代码这里
shotService告诉我们对手投了什么球,然后在this.drawShot我们的帮助下画出这些球