Могу ли я сделать HTTP POST через новый window.open, используя Angular? - PullRequest
0 голосов
/ 16 марта 2020

У меня проблемы с отправкой HTTP-запроса в моем приложении angular. из компонента правой боковой панели всякий раз, когда пользователь нажимает кнопку, вызываемую этой функцией:

//right-sidenav.component.html
info() {
    this.infoService.getInfo().subscribe(layers => {
      if (layers) {
        let handler: any = window.open(
          "/info-window",
          "Info",
          "width=1200,height=500"
        );
        handler["tableData"] = [];
        handler["signals"]= this.signals
        handler["tableData"]["tableNumeric"] = layers[0];
        handler["tableData"]["tableString"] = layers[1];
        handler["tableData"]["tableDatetime"] = layers[2];
      }
    });

из ответа, я получаю 3 типа информации о таблице, которая будет отображаться во всплывающем окне. Я также посылаю информацию о сигналах во всплывающее окно. и всякий раз, когда пользователь нажимает signals, он отправляет HTTP-запрос. Но здесь у меня проблема. Я не могу сделать запрос Http. Я не вижу ни одного запроса через inspect --> Network.

Я не уверен, могу ли я сделать HTTP-запрос из всплывающего окна или нет.

Вот мое всплывающее окно:

//info-window
constructor(public infoService: InfoService,
    protected apiService: ApiService,) {}
  ngOnInit() {
    const int = setInterval(() => {
      if (!window["tableData"]) {
        return;
      }

      this.tableNumeric = new Array(window["tableData"]["tableNumeric"]);
      this.tableString = new Array(window["tableData"]["tableString"]);
      this.tableDatetime = new Array(window["tableData"]["tableDatetime"]);
      this.signals = window["signals"];
      this.table.push(this.tableNumeric, this.tableString, this.tableDatetime);
      clearInterval(int);
    }, 500);
  }

  displayPlotting() {
    if(isNull(this.selectedSignal)) {
      return
    }
    let response = {};

    response["table_info"] = {
      data: {}
    };
    for (let signal of this.selectedSignal) {
      response["table_info"]["data"][signal.key] = signal.name;
    }
    response["results"] = {
      table: ["table_info"]
    };
    console.log("InfoService -> response", response);

     this.apiService.post("info/plot", response).pipe(
      map(result => {
        console.log("InfoService -> result", result);
        return result;
      })
    );
    //let plot = this.infoService.getPlotting(this.selectedSignal)
    //console.log("InfoWindowComponent -> displayPlotting -> plot", plot)

  }
}

Вот код apiService:

//apiservice.service.ts 
post(route: string, data: any, withCredentials?: boolean, loading: boolean = true): Observable<any> {
    if (loading) {
      this.$loading.next(true);
    }
    const url = this.localStorageService.getDjangoHost() + route;
    this.saveRequestParam('post', url, data, withCredentials);

    return this.postTemplate(url, data, withCredentials)
      .pipe(
        catchError(error => this.handleError('post', error, url)),
        finalize(() => {
          if (loading) {
            this.$loading.next(false);
          }
        })
      )
      .pipe(
        map((result: any) => {
          this.handleLeftSideMessage(result);
          return result;
        })
      );
  }

Может кто-нибудь помочь мне решить эту проблему? Как я могу сделать запрос Http post из всплывающего окна ??

1 Ответ

1 голос
/ 16 марта 2020

post метод в вашем ApiService возвращает Observable. Наблюдаемый экземпляр начинает публиковать значения только тогда, когда кто-то подписывается на него. Angular документы

Простейшим способом будет:

this.apiService.post("info/plot", response).pipe(
  map(result => {
     console.log("InfoService -> result", result);
       return result;
  }).subscribe();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...