Репликация данных в реактивном списке с помощью Spring WebFlux, Reactive MongoDB и Angular - PullRequest
0 голосов
/ 24 февраля 2019

Я новичок в 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) для достижения той же цели (добавьте только новое значение, когда оно будет вставлено) ??

И еще один вопрос: когда я возвращаюсь в угловое приложение в браузере после вставки в базу данных (из другого окна браузера) данные не «графически» обновляются, я должен щелкнуть где-нибудь, чтобы обновить списоквид.Это угловая функция, или это зависит от браузера или чего-то еще?

...