如何使用observables在angular2中异步绑定下拉列表?

如何使用observables在angular2中异步绑定下拉列表?

问题描述:

我是新来的angular2,我想知道如何使用angular2异步绑定下拉? 我有这样如何使用observables在angular2中异步绑定下拉列表?

this.http.get('http://172.17.40.41:8089/api/Master/GetAllCountry') 
      .subscribe(value => { 
       var results = JSON.parse(value['_body']); 
       for (let d of results) { 
        this.countries.push(new Country(d['Country'], d['CountryCode'])) 
       } 
      }, error => error,() => { 
       console.log('complete'); 
       return this.countries; 

      }); 

服务和我打电话从组件这样

this.countries = this.countryServices.getCountry(); 

服务现在,当我试图在下拉列表中的数据绑定,我不能够绑定它

<select class="form-control input-sm" formControlName="country">            
    <option class="small" *ngFor="let c of countries" value="{{c.countryCode}}">{{c.countryName}}</option> 
</select> 

我也尝试使用angular2的keyup事件像这样(keyup)=“0”,但它从来没有工作。

我在试图找到答案时遇到了您的问题。

我不清楚你的服务是否返回了可观察的。 这是我的解决方案,如果它帮助某人,毕竟这个时间:

首先,这个服务从firebase数据库获取数据并转换为自定义接口,将其作为可观察对象返回。在真正的服务中应该包括错误处理程序。

import {Injectable} from "@angular/core"; 
import {AngularFireDatabase} from "angularfire2/database/database"; 
import {IkeyName, KeyValPair} from "interfaces/IkeyName"; 
import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/observable/fromPromise'; 
import 'rxjs/add/operator/map'; 

@Injectable() 
export class SelectLists { 
private rootRef = this.db.database.ref(); 

constructor(public db: AngularFireDatabase) {} 

getAllOrgs(): Observable<IkeyName[]> { 
var companyKeys = this.rootRef.child('organization'); 

return Observable.fromPromise(companyKeys.once("value")).map((data) => { 
    var kps: IkeyName[] = []; 

    for (let orgKey of Object.keys(data.val())){ 
     //Custom translation of database data to Your interface 
     var kp = new KeyValPair(); 
     kp.Id = data.val().databaseId 
     kp.Name = data.val().databaseNameValue 
     kps.push(kp); 
    } 
    return kps; 

}); 

接下来,在组件类中,我们注入服务并调用它。

export class GrowerReceiptComponent implements OnInit { 
public orgList : Observable<IkeyName[]>; 
public selectedOrg : IkeyName; 

constructor(public selLists: SelectLists) { 
    this.orgList = selLists.getAllOrgs(); 
} 

ngOnInit() {} 
} 

...最后结合该观察的价值下拉视图 请注意: 1.观察到的是与视图订阅| ansync 2.所选项目绑定到整个对象,而不仅仅是一个值属性 3.可见部分只保留在对象的名称部分。

<select class="form-control" required [(ngModel)]="selectedOrg" > 
    <option *ngFor="let org of orgList | async" [ngValue]="org">{{org.Name}}</option> 
</select> 

希望这有助于