2017-02-20 2 views
0

Я довольно новичок в Observables, Promises, Angular 2 и Javascript.Проходящие параметры к отображаемым наблюдаемым

Мой вопрос, как я могу получить ссылку на «пункт» объект здесь:

getItemTransactions (item: Item): Observable<any> { 
    // Do some stuff ... 

    return this.http.post(this.url, body, options) 
        .map(this.extractData) 
        .catch(this.handleError); 
    } 

В отображенной помощник extractData?

private extractData(res: Response) { 
    let json = res.json().body 

    /// How do I assign back to item object here? 
    item.some_property = json["some_property"] 
    } 

код пришел отсюда: https://angular.io/docs/ts/latest/guide/server-communication.html#!#extract-data

ответ

1
  1. Карта должна использоваться для преобразования типа к другому типу. При использовании службы http вы должны преобразовать ожидаемый результат json в ожидаемый и известный тип. Это можно сделать с использованием метода .json() по ответу.
  2. Используйте subscribe, чтобы затем сделать что-то с ожидаемым результатом от .json().

Все ваши действия могут выполняться в кузове выражений, вам не нужны отдельные методы для них. Это предпочтение, так что все, что вы выбираете, в порядке.

См. Код ниже.

getItemTransactions (item: Item): Observable<any> { 
// Do some stuff ... 

    return this.http.post(this.url, body, options) 
       .map((res) => res.json()) // get the data from the json result. This is equivalent to writing {return res.json()} 
       .subscribe((data) => { 
        this.doSomethingWithData(data, item); // pass that deserialized json result to something or do something with it in your expression 
       }) 
       .catch(this.handleError); 
} 

private doSomethingWithData(data: any, item: Item) { 
    // Do some stuff ... 

    item.some_property = data["some_property"]; 
} 
1

Почему вы хотите, чтобы повторно назначить параметр метода в первую очередь? Вероятно, вы захотите присвоить свойство класса (this.item против item).

Но если по каким-то причинам вы действительно хотите переназначить item параметров, вы всегда можете встраивать в extractData помощника, т.е .:

getItemTransactions(item: Item): Observable<any> { 
    return this.http.post(this.url, body, options) 
       .map((res: Response) => { 
        item = res.json(); // Re-assign some value to `item` 
       }) 
       .catch(this.handleError); 
} 

Это, вероятно, не то, что вы хотите сделать. Обычная модель состоит в том, чтобы функция возвращала наблюдаемое значение и subscribe() в наблюдаемое где-то еще в вашем коде. Вы можете выполнить назначение внутри обратного вызова подписки.

Это переведет на следующий код:

getItemTransactions(item: Item): Observable<any> { 
    return this.http.post(this.url, body, options) 
       .map((res: Response) => res.json()) 
       .catch(this.handleError); 
} 

// Somewhere else in your code 
this.getItemTransactions(item: Item).subscribe(data => { 
    item = data; // for instance 
}