2016-07-27 2 views
1

Я пытаюсь извлечь определенные значения 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, но когда я делаю поэтому я получаю неопределенный объект в моей функции подписки, и сортировка вызывает ошибку. Я думаю, я мог бы не понимать, как работает карта или подписка.

Есть ли у кого-нибудь идеи о том, как это сделать?

ответ

0

вероятно ваш должны послать параметр, как это: -

// question.service.ts 
getQuestions(): Observable<QuestionBase<any>[]> { 
return this.http.get(this.jsonUrl) 
    .map(res => this.extractTest(res)) //here you have to send parameter and return it back to the subscribe function 
    .catch(this.handleError); 
} 
private extractTest(res: Response) { 
let body = res.json(); 
return body["test"] || {}; 
} 

, если не решить вашу проблему, комментарий здесь.

Update

По мне, если вы используете .map с многострочным, то вы должны использовать ключевое слово return для возвращения его обратно что-то, но когда вы используете простую одиночную линию .map, чем нет необходимости писать return. по сути, основное различие. так что в вашем случае попробуйте это

return this.http.get(this.jsonUrl).map(res => { return this.extractTest(res, selected); }) .catch(this.handleError); 

вместо этого

return this.http.get(this.jsonUrl).map(res => { this.extractTest(res, selected); }) .catch(this.handleError); 
+0

Я попытался функцией карты с кронштейнами для кода многострочного, таких как 'вернуть this.http.get (this.jsonUrl). map (res => { this.extractTest (res, selected);}) .catch (this.handleError); ', но я не пробовал его с одной строкой. Я не понимаю, почему была разница, но спасибо большое! –

+0

Ваш прием @ D.Simon см. Мое обновление –

+1

О, я вижу сейчас. Спасибо! –

Смежные вопросы