我想根据上一个选择框中的国家/地区在选择框中显示城市名称。我在第一个选择框中显示国家但在点击事件中我无法显示城市,我不知道如何将嵌套的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>
答案 0 :(得分:0)
我对cities
和states
感到困惑,但我认为这有点像你要找的;
在你的第一个下拉菜单中你需要这样的东西:
<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}}获取数据调用的最后一个值。它非常优雅。