根据angular5

时间:2018-05-01 15:34:24

标签: json angular angular5 angular2-template angular2-directives

我想根据上一个选择框中的国家/地区在选择框中显示城市名称。我在第一个选择框中显示国家但在点击事件中我无法显示城市,我不知道如何将嵌套的json访问到html.Please帮助。

这是我的json文件

  [
   { 
  "countryName": "India", 
    "cities": [
      { 
          "id": 1, 
          "name": "Banglaore", 
          "founded": -200, 
          "beautiful": true, 
          "data": 123,
          "keywords": ["Kaveri", "River"] 
      },
      { 
          "id": 1, 
          "name": "Pune", 
          "founded": 0, 
          "beautiful": false, 
          "data": "no",
          "keywords": ["FSDF", "FS"] 
      }
  ]
},
{ 
  "countryName": "US", 
  "cities": [
      { 
          "id": 2, 
          "name": "CA", 
          "founded": -200, 
          "beautiful": true, 
          "data": 123,
          "keywords": ["RT", "SSF"] 
      },
      { 
          "id": 2, 
          "name": "NY", 
          "founded": 0, 
          "beautiful": false, 
          "data": "no",
          "keywords": ["GSG", "DG"] 
      }
  ]
}
]

app.component.ts文件是

import { Component } from '@angular/core';
import { Http,Response } from '@angular/http';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/filter';
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {


  constructor(private http: Http) { }
public myData;
public v;

ngOnInit(){

 this.http.get("assets/file.json")
  .map((res:Response)=> res.json())
  .subscribe(data =>{this.myData = data})

}



onChange(event): void {  // event will give you full breif of action
  const newVal = event.target.value;
this.v =newVal;















}
}

app.html文件是

<select (change)="onChange($event)" >
    <option value="0">--All--</option>
    <option *ngFor="let d of myData">
        {{d.countryName}}
    </option>
  </select>
  <br/>


  <br/>

  <select >
        <option value="0">--All--</option>
        <option *ngFor="let object of myData" value="object.countryName" [selected]="object.countryName === v">{{object.cities}}</option>
    </select>

1 个答案:

答案 0 :(得分:0)

我对citiesstates感到困惑,但我认为这有点像你要找的;

在你的第一个下拉菜单中你需要这样的东西:

<select (change)="onChange($event)" >
  <option value="0">--All--</option>
  <option *ngFor="let d of myData" [value]="d" >
    {{d.countryName}}
  </option>
</select>

因此,您的选项的值与countryName匹配,您的onChange方法将确保v属性在更改时设置为对象(包含国家/地区和城市)

<select =>
  <option value="0">--All--</option>
  <option *ngFor="let city of v.cities" value="object.countryName">{{city.name}}</option>
</select>

有些方面的评论: - 你现在正在&#34; chaining&#34;你的rxjs运算符(以及更改Observable原型),因为RxJs版本5.5.6你可以&#34;管道&#34;相反,我认为这种使用运算符的方式最终会消失。所以如果你能改变它,那就鼓励了。 - 你正在使用&#34; old&#34;通过Http获取数据的方式,现在鼓励HttpClient。 - 看看Angular中的Reactive Forms,它会使您的代码更清晰,更容易推理

考虑到我的评论,你可以这样:

export class AppComponent {
    form = new FormGroup({
        country: new FormControl('', [Validators.required]),
        city: new FormControl('', [Validators.required])
    })

    data$ = this.httpClient.get('assets/file.json').pipe(share());

    countries$ = this.data$.pipe(
        map(data => data.map(entry => entry.countryName)),
        startWith([])
    );

    cities$ = this.form.get('country').valueChanges.pipe(
        withLatestFrom(this.data$)
        map(([selectedCountry, allData]) => {
            const entry = allData.find(item => item.countryName === selectedCountry);
            return entry.cities;
        })
        startWith([])
    );

    constructor(private httpClient: HttpClient) { 
    }
}

您必须在所选内容中添加formControlName属性,而选择选项则需要async管道。 通过使用带有formControls的表单,您不需要进行onChange事件。 countries$从数据调用的结果中生成cities$,并通过countrySelect +的valueChanges生成{{1}}获取数据调用的最后一个值。它非常优雅。