Я пытаюсь извлечь определенные значения JSON на основе выбранного пользователем ввода, который является ключом, и превратить его в QuestionBase<any>[]
. В настоящее время, я делаю это, который работает только для извлечения test
:Угловой 2 Извлечение JSON на основе выбранного значения формы
// dropdown HTML
<select class="form-control" name="test" id="test" (ngModel)="test" (change)="onSelectChange($event, test.form)">
<option selected disabled hidden style='display: none' value=''></option>
<option value="test">Test</option>
<option value="other">Other</option>
</select>
// question-list.component.ts
onSelectChange($event: any, form: NgForm) {
this.getQuestions();
}
getQuestions() {
this.questionService.getQuestions()
.subscribe(questions => this.questions = questions.sort((a, b) => a.order - b.order),
error => this.errorMessage = <any>error);
}
// question.service.ts
getQuestions(): Observable<QuestionBase<any>[]> {
return this.http.get(this.jsonUrl)
.map(this.extractTest)
.catch(this.handleError);
}
private extractTest(res: Response) {
let body = res.json();
return body["test"] || {};
}
// JSON
{
"test": [{
key: 'firstName',
label: 'First name',
value: 'Bombasto',
required: true,
order: 1
}, {
key: 'brave',
label: 'Bravery Rating',
options: [
{key: 'solid', value: 'Solid'},
{key: 'great', value: 'Great'},
{key: 'good', value: 'Good'},
{key: 'unproven', value: 'Unproven'}
],
order: 2
}],
"other": [{
key: 'emailAddress',
label: 'Email',
type: 'email',
order: 1
}]
}
До сих пор я пытался пропусканием выбранного значения в качестве аргумента getQuestions()
и extractTest
так, чтобы я мог вернуться body[selected] || {}
в extractTest
, но когда я делаю поэтому я получаю неопределенный объект в моей функции подписки, и сортировка вызывает ошибку. Я думаю, я мог бы не понимать, как работает карта или подписка.
Есть ли у кого-нибудь идеи о том, как это сделать?
Я попытался функцией карты с кронштейнами для кода многострочного, таких как 'вернуть this.http.get (this.jsonUrl). map (res => { this.extractTest (res, selected);}) .catch (this.handleError); ', но я не пробовал его с одной строкой. Я не понимаю, почему была разница, но спасибо большое! –
Ваш прием @ D.Simon см. Мое обновление –
О, я вижу сейчас. Спасибо! –