Angular 2 Select - Загрузить данные из проблемы с веб-службой

Я использую ng2-select для отображения списка элементов, чтобы пользователь мог искать и найти подходящий из списка выбора. Проблема, с которой я столкнулся, заключается в том, что он работает только со статическими данными. Мои данные загружаются из веб-сервиса RESTful. Я пробовал несколько хаков и трюков, но не могу загрузить данные из веб-службы в ng2-select. Похоже, этот плагин не поддерживает загрузку данных веб-службы. Есть ли рабочий хак для загрузки данных веб-сервиса в ng2-select?

Если нет, предложите другой плагин angular2, который может загружать данные из веб-службы и позволяет пользователю искать и выбирать.

Обновление:
Я не упомянул, что успешно получаю данные из своего веб-сервиса. Нет проблем с получением данных из веб-сервиса. Проблема с ng2-select. Я успешно заполняю массив items полученными данными из веб-службы (подтверждено массивом печатных элементов на консоли), но ng2-select ничего не показывает. Если я не извлекаю данные из веб-службы, а только заполняю массив локальными данными (которые назначаются во время инициализации), он работает и отображает локальные данные.
Он просто не может работать с запросами. Вот пример кода из комментария

Product-Category.service.ts

import { Injectable } from '@angular/core';
import { Http} from '@angular/http';
import {Observable} from "rxjs";

@Injectable()
export class ProductCategoryService
{
    apiUrl: string = "http://jsonplaceholder.typicode.com/users";
    constructor(private http : Http){}
    public getUserData(): Observable<any> {
        return this.http.get(this.apiUrl)
            .map(result => {
                return result.json();
            });
    }
}

Product-category.component.ts

import { Component, OnInit , ViewChild , AfterViewInit , ElementRef } from '@angular/core';
import { Http, Headers , Response , RequestOptions } from "@angular/http";

import { Observable } from 'rxjs/Rx';

@Component({
    selector: 'product-category',
    templateUrl: 'product-category.component.html',
    styles: []
})
export class AddProductCategoryComponent implements OnInit
{
    public items = [];
    my :boolean= false;
    constructor(public productCategoryService:ProductCategoryService){}
    ngOnInit()
    {
        this.getItems();
    }
    getItems()
    {
        this.productCategoryService.getUserData().subscribe(
            items => this.items
    );
    }

Update2: для простоты я приложил код и изображение, чтобы лучше понять. Вы можете видеть в коде и изображении, что после получения ответа от сервера. Результат можно увидеть в консоли. Но для простоты добавим запись в массив вручную. Вы можете видеть, что ng2-select отображает только данные, которые были заполнены до отправки запроса, но массив также содержит объект, который был заполнен после получения ответа от сервера.
Код

public items: any = [];
ngOnInit()
    {
        this.items.push({id : 1 , text : 'Option1'});
        this.getItems();
        console.log(this.items);
    }
    getItems()
    {
        this.productCategoryService.getUserData().subscribe(
            success =>
            {
                this.items.push({id : 2 , text : 'Option2'});
                console.log(success);
            }
    );
    }

Изображение ng2-select


person usmanwalana    schedule 10.11.2016    source источник
comment
не могли бы вы добавить код   -  person Ric K    schedule 10.11.2016
comment
Пожалуйста, взгляните на код   -  person usmanwalana    schedule 10.11.2016


Ответы (1)


для этого вы можете создать службу, которая извлекает данные с вашего сервера

@Injectable()
export class UserService {
  apiUrl: string = "http://jsonplaceholder.typicode.com/users";

  constructor(private http: Http) {
  }


  //getUserData(): Observable<any> {

    //return this.http.get(this.apiUrl)
    //  .map(result => {
    //    return result.json();
    //  });
  //}
  // just for testing use this mechanisum if it working for you or not
  getUserData(): Promise<any[]> {
      return Promise.resolve(ITEMS);
  } 


}

public ITEMS:Array<string> = ['Amsterdam', 'Antwerp', 'Athens', 'Barcelona',
'Berlin', 'Birmingham', 'Bradford', 'Bremen', 'Brussels', 'Bucharest',
'Budapest', 'Cologne', 'Copenhagen', 'Dortmund', 'Dresden', 'Dublin',
'Düsseldorf', 'Essen', 'Frankfurt', 'Genoa', 'Glasgow', 'Gothenburg',
'Hamburg', 'Hannover', 'Helsinki', 'Kraków', 'Leeds', 'Leipzig', 'Lisbon',
'London', 'Madrid', 'Manchester', 'Marseille', 'Milan', 'Munich', 'Málaga',
'Naples', 'Palermo', 'Paris', 'Poznań', 'Prague', 'Riga', 'Rome',
'Rotterdam', 'Seville', 'Sheffield', 'Sofia', 'Stockholm', 'Stuttgart',
'The Hague', 'Turin', 'Valencia', 'Vienna', 'Vilnius', 'Warsaw', 'Wrocław',
'Zagreb', 'Zaragoza', 'Łódź'];

попробуйте этот код, и вы получите данные 10 пользователей. это основной способ, вы можете вызвать любой API GET в Angular 2.

добавьте эту службу в файл @NgModule в файле ap.module.ts:

@NgModule({
    providers: [UserService]
})

чем вызывать эту службу в классе Component следующим образом:

items = [];


constructor(private userService: UserService){}

onNgInit(){
   this.getItems();
}

getItems() {
    //this.userService.getUserData().subscribe(
    //   items => this.items;
    //);
    this.userService.getUserData().then(results=> this.items = results);
}



<ng-select [allowClear]="true"
              [items]="items" // here that items will come, but it will be object, i hope in your service you will get Array[] items.
              [disabled]="disabled"
              (data)="refreshValue($event)"
              (selected)="selected($event)"
              (removed)="removed($event)"
              (typed)="typed($event)"
              placeholder="No city selected">
  </ng-select>
person Vinay Pandya    schedule 10.11.2016
comment
Не было проблем с получением данных из веб-сервиса. Я все еще тестировал ваш код, и теперь ng2-select ничего не показывает. - person usmanwalana; 10.11.2016
comment
можете ли вы показать свой код и данные, чтобы я мог посмотреть на это - person Vinay Pandya; 10.11.2016
comment
Спасибо за вашу постоянную поддержку @Vinay. Я добавил изображение и код. Надеюсь, поможет. - person usmanwalana; 10.11.2016
comment
заменили этот URL-адрес jsonplaceholder.typicode.com/users в моем коде на ваш URL-адрес API? bcz этот URL-адрес дает вам данные другого типа, которые не поддерживаются ng2-select. - person Vinay Pandya; 10.11.2016
comment
Вы используете AdminLTE с angular 2? Можете ли вы поделиться, где вы это нашли? - person Vinay Pandya; 10.11.2016