У меня есть некоторая путаница с 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>
Некоторые побочные замечания:
- вы в настоящее время «связываете» свои операторы rxjs (и изменяете прототип Observable), так как RxJs версии 5.5.6 вы можете вместо этого «транслировать» их, я думаю, что этот способ использования операторов со временем исчезнет. Так что, если вы можете изменить это, это поощряется.
- Вы используете «старый» способ извлечения данных через Http, теперь HttpClient
приветствуется.
- Посмотрите на Reactive Forms в Angular, это сделает ваш код чище и легче рассуждать о
Учитывая мои замечания, у вас может быть что-то вроде этого:
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$
get сгенерировано из результата вызова данных, а cities$
get сгенерировано значением ValueChanges of countrySelect +, принимающим последнее значение вызова данных. Это довольно элегантно.