поиск с использованием асинхронного источника (обещание Angular2)

#search #asynchronous #angular #promise #semantic-ui

#Поиск #асинхронный #угловой #обещание #семантический-пользовательский интерфейс

Вопрос:

Я использую компонент поиска Semantic-UI и обещание Angular2. Вот мой код:

foo.component.ts:

 export class FooComponent implement OnInit {
    myData:any = [];
    ...

    ngOnInit() {
        this.myDataService.getData().then(myData => this.myData = myData);
        $('.ui.search').search({ source: this.myData });
    }
}
  

foo.component.html:

 <div class="ui search">
    <input class="prompt" type="text">
    <div class="results"></div>
</div>
  

Но source всегда пусто. Я думаю, это происходит из-за асинхронного вызова службы передачи данных.

Вы знаете, как я могу это решить?

Ответ №1:

Ответ от fstanis технически правильный. Но у меня есть небольшое дополнение к тому, что он пропустил. Операция сохраняла результаты в свойстве уровня компонента и не использовала возвращенный результат напрямую, возможно, для последующего использования. Я также добавляю к этому ответу еще один возможный способ достижения этой цели.

1) Способ, которым OP пытался это сделать

 export class FooComponent implement OnInit {
    myData:any = [];
    ...

    ngOnInit() {
        this.myDataService.getData().then(myData => {
            this.myData = myData;
            $('.ui.search').search({ source: this.myData });
        });
    }
}
  

2) Использование подписки Angular 2

 export class FooComponent implement OnInit {
    myData:any = [];
    ...

    ngOnInit() {
        this.myDataService.getData().subscribe(
            data => {
              this.myData = data;
              $('.ui.search').search({ source: this.myData });
            },
            error => {
              // Write your logic here if an error was occurred. Use the variable "error" which has info about what happened.
            },
            () => {
              // This fires when the call has been finished. Just like .complete in jQuery.get or jQuery.post. So that you can do necessary operations after everything is completed.
            }
        );
    }
}
  

Вот как должен выглядеть ваш сервис

 import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import {Observable} from 'rxjs/Rx';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';

@Injectable()
export class MyDataService {

  constructor(private http:Http) { }

  getData(){
    return this.http.get('some/api/url').map(
        res => res.json()
    );
  }

}
  

Надеюсь, это поможет.

Комментарии:

1. Спасибо за вашу помощь, но оба решения не работают. Всплывающее окно поиска пустое.

2. Вы проверили, правильно ли ваша служба angular 2 извлекает данные с сервера? Позвольте мне обновить свой ответ, включив пример того, как должна выглядеть служба.

3. Он работает с использованием mockResponse компонента поиска Semantic-UI.

4. Ваше решение использует Observable вместо Promise .

5. Ну, я предоставил несколько способов достижения вашего конечного результата.

Ответ №2:

Прямо сейчас вы инициализируете поиск с начальным значением (пустым массивом), поскольку данные еще не поступили при запуске ngOnInit .

Самое простое решение для этого конкретного случая — просто дождаться поступления ваших данных перед инициализацией компонента поиска:

 export class FooComponent implement OnInit {
    ...

    ngOnInit() {
        this.myDataService.getData().then(myData => {
            $('.ui.search').search({ source: myData });
        });
    }
}
  

Имейте в виду, что компонент поиска Semantic UI имеет встроенный механизм для удаленного хранения результатов поиска — возможно, вы захотите проверить его в разделе использование документации, чтобы узнать, можете ли вы использовать его вместо этого.

Комментарии:

1. Я прочитал эту ссылку в документах, но я не могу понять, как применить «способ Angular2» (обещание) к компоненту поиска. Можете ли вы мне помочь?