Я новичок в Spring WebFlux и пытаюсь написать простой клиент, который запрашивает у сервера список идентификаторов и обновляет его в режиме реального времени.Основываясь на том, что я нашел здесь на stackoverflow и вообще в Интернете, я написал следующие шаги.Модель данных на стороне сервера (просто объект с идентификатором)
@Document
public class Account {
@Id
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
Репозиторий
@Repository
public interface AccountRepository extends ReactiveMongoRepository<Account, Integer> {
}
Контроллер
@RestController
@CrossOrigin()
public class ControllerRest {
@Autowired
AccountCrudRepository accountCrudRepository;
@GetMapping("/salva/{id}")
public void salva(@PathVariable int id){
try {
Account acc = new Account();
acc.setId(id);
accountCrudRepository.save(acc).block();
}catch(Exception e){
e.printStackTrace();
}
}
@GetMapping("/getaccounts")
public Flux<Account> getall(){
return accountCrudRepository.findAll();
}
}
На стороне клиента У меня есть следующие машинописные коды
Сервис
constructor(private http: HttpClient) { }
quotes : Account[] = [];
prendituttiaccounts():Observable<Array<Account>>{
const url = this.endpoint + 'getaccounts';
this.quotes = [];
return Observable.create((observable) => {
let eventSource = new EventSource(url);
eventSource.onmessage = (event) => {
const json = JSON.parse(event.data);
const acc = new Account();
acc.id = json['id'];
this.aggiungiInQuote(acc);
// this.quotes.push(acc);
observable.next(this.quotes);
};
});
}
aggiungiInQuote(account){
for(let curr of this.quotes){
if(curr.id === account.id){
return;
}
}
this.quotes.push(account);
}
Компонент
quotes: Observable<Account[]>;
constructor(private fattservice:FatturaService) { }
ngOnInit() {
this.quotes = this.fattservice.prendituttiaccounts();
}
И компонент шаблона
<div>
<ul>
<li *ngFor="let obj of quotes | async">
{{obj.id}}
</li>
</ul>
</div>
Если я непосредственно выполню нажатие (this.quotes.push(acc)) в массив, когда я получаю сообщение, данные в массиве quotes будут реплицироваться каждый раз, когда поступает сообщение (я видел, что сообщения поступают также, если что-то добавляется в базу данных)
Есть что-томенее тяжелая, чем моя функция aggiungiInQuote (account) для достижения той же цели (добавьте только новое значение, когда оно будет вставлено) ??
И еще один вопрос: когда я возвращаюсь в угловое приложение в браузере после вставки в базу данных (из другого окна браузера) данные не «графически» обновляются, я должен щелкнуть где-нибудь, чтобы обновить списоквид.Это угловая функция, или это зависит от браузера или чего-то еще?