Ответ 1
Вам не нужна специальная труба. Angular 2 необязательное поле suppport. Вам просто нужно добавить? в вашем объекте
{{ (data | async)?.name }}
или
{{(name | async)?}}
Изменить: похоже, моя главная проблема заключается в том, что я не могу отображать асинхронные данные из объекта. У меня есть обещание, содержащее объект данных, и когда я использую
{{ data | async }}
отобразится
[object Object]
Проблема заключается в том, что я хочу иметь возможность отображать все разные атрибуты; iee, Name, Symbol и т.д. В Angular 1 я просто использовал бы
{{ data.Name | async }}
но это не работает здесь, так как асинхронный канал пытается решить проблему с data.Name, которая не существует. Я хочу разрешить обещание данных, а затем отобразить из него имя. На данный момент я работаю над созданием своего собственного канала для отображения ключа от объекта async, но мне интересно, есть ли там встроенный Angular 2 канал или функция для этого!
Я создал класс StockService, который возвращает Promise, содержащий объект, в мой класс StockInfo, который содержит отображаемый HTML. Я хочу показать имя этого объекта в своем HTML, но я не могу его отобразить.
В моем конструкторе StockInfo:
this.stock.getStockData(this.ticker, http).then(function(val) {
this.data = val;
this.name = new Promise<string>(function(resolve) {
resolve(this.data.Name);
});
});
где this.stock - это объект StockService.
В моем HTML:
<h2>{{name | async}}</h2>
Я пробовал несколько различных аранжировок, прежде чем поселиться на этом. Я хочу, чтобы класс StockService обрабатывал выборку данных и класс StockInfo для обработки отображения. В Angular 1 я создал бы factory для извлечения данных и обработки данных в контроллере, но я не совсем уверен, как это сделать в Angular 2.
Есть ли способ заставить его отображать, или есть ли лучшие способы разработки моего кода, на который я должен смотреть? Спасибо!
Вам не нужна специальная труба. Angular 2 необязательное поле suppport. Вам просто нужно добавить? в вашем объекте
{{ (data | async)?.name }}
или
{{(name | async)?}}
Вы также можете использовать Pluck из rxjs/наблюдаемым:
{{ user.pluck("name") | async }}
Pluck Возвращает Observable, содержащий значение указанного вложенного свойства из всех элементов последовательности Observable. Если свойство не может быть разрешено, оно вернет undefined для этого значения.
Если вы работаете с Observable, вы можете отображать данные следующим образом:
<div *ngIf="data | async; let _data">
<h3>{{_data.name}}</h3>
</div>
или
<h3>{{(data | async).name}}</h3>
Я думаю, что вы делаете это слишком сложным и просто нужно сделать что-то вроде этого.
this.name =
this.stock.getStockData(this.ticker, http)
.then( val => val.Name )
и
<h2>{{name.Name | async}}</h2>
Итак, я закончил писать свой собственный асинхронный ключевой канал. Огромное спасибо Симону за то, что он помогает мне здесь.
import {Pipe} from 'angular2/core';
@Pipe({
name: 'key',
pure: false
})
export class KeyPipe {
private fetchedPromise: Promise<Object>;
private result: string;
transform(value: Promise<Object>, args: string[]) {
if(!this.fetchedPromise) {
this.fetchedPromise = value
.then((obj) => this.result = obj[args[0]] );
}
return this.result;
}
}
Использование:
<h2>{{ data | key: 'Name' }}</h2>
Кто-нибудь, пожалуйста, прокомментируйте, если Angular имеет свои собственные функции для разрешения ключа от асинхронного объекта.