NgForなしで非同期パイプを使用する必要があります。オブザーバブルで非同期にロードされるオブジェクトのプロパティを確認する必要があります。
これは私が欲しいものですが、動作していません:
<ion-item *ngIf="user$.anonymouse | async">
<ion-label>Login</ion-label>
</ion-item>
//編集:上記のコードを使用するとこのエラーが発生します
例外:[!user $ .anonymouse |のパイプ 'AsyncPipe'の無効な引数 'true' SettingsPage @ 27:22の非同期]
これを解決する方法はありますか?
私はCtrlでこのオブザーバブルをサブスクライブし、値を通常の変数に保存できることを知っていますが、パフォーマンスなどのためにそれをしたくない.
_*ngIf
_ディレクティブはtrue
またはfalse
を予期し、結果の式を使用してDOMのHTML
要素をレンダリングするかどうかを決定するため、エラーは驚くほど正確です。 。
例外:[!user $ .anonymouse |のパイプ 'AsyncPipe'の無効な引数 'true' SettingsPage @ 27:22の非同期]
使用できる式は_user$.anonymouse
_であり、これは真実と評価されますが、残念ながらこのディレクティブでasync
パイプを使用することはできません。 async
パイプは、たとえば_*ngFor
_ディレクティブのスコープ内で結果の出力を公開する入力を "変換"( "パイプ"とも呼ばれます)します。
パイプは、以下で定義される3つの可能なタイプのいずれかを想定しています( AsyncPipeについての詳細 ):
transform(obj: Observable<any>| Promise<any>| EventEmitter<any>)
これを解決する方法はありますか?
はい、設計どおりに使用できます。たとえば、_*ngFor
_ディレクティブの場合:
_<ion-item *ngFor="(user$ | async)?.anonymouse">
<ion-label>Login</ion-label>
</ion-item>
_
または、_*ngIf
_ディレクティブには必要ないため、配管を完全に削除することもできます。
_<ion-item *ngIf="user$.anonymouse">
<ion-label>Login</ion-label>
</ion-item>
_
@Seanのコメントで述べられているように、*ngIf
ステートメントは、返されるuser$
オブジェクトの結果オブジェクトプロパティanonymouse
に基づいている必要があります。など:
<ion-item *ngIf="(user$ | async)?.anonymouse">
<ion-label>Login</ion-label>
</ion-item>
これは私にとってはうまくいきました。以下は、以下のパイプからの結果を使用する方法の例です。
message$: Observable<{message: string}>;
private messages = [
{message: 'You are my hero!'},
{message: 'You are the best hero!'},
{message: 'Will you be my hero?'}
];
constructor() { this.resend(); }
resend() {
this.message$ = Observable.interval(500)
.map(i => this.messages[i])
.take(this.messages.length);
}
<h2>Async Hero Message and AsyncPipe</h2>
<p>Message: {{ (message$ | async)?.message }}</p>
<button (click)="resend()">Resend</button>`
実際の例は here にあります。
これも役に立つと思う:
<!-- This is needed to wait for async pipe to resolve -->
<div *ngIf="user$ | async as user">
<!-- Only on resolve of async pipe -->
<ion-item *ngIf="user.whateverPropertyYouWantToCheck">
<ion-label>Login</ion-label>
</ion-item>
</div>
user$
からuser
に切り替えたことに注意してください。同じ変数名を使用することもできますが、これにより非同期パイプではなくなっていることがより明確になります。