私はイオン2(RC 2)プロジェクトに角2のカスタムパイプを使用しようとしていますが、書き方を工夫することはできません。私の最大の問題は、パイプがデータベースからのデータに依存して、フィルタがtrueまたはfalseを返す必要があるかどうかを判断することです。イオン2パイプはデータベースのデータを必要とします - これはどのように可能ですか?
newsData配列:
[
{
"id": 0,
"softwareName": 0,
"categoryName": 0,
"title": "Notification Title",
"description": "Shoft description for notifications",
"date": "2016-01-05 16:23:23"
}
]
設定JSON getCategoriesForAllSoftware()によって返される:
import {Pipe, PipeTransform} from '@angular/core';
import {Platform} from 'ionic-angular';
import {DatabaseService} from '../providers/database/init';
import {GlobalFunctions} from '../providers/globalFunctions';
@Pipe({name: 'notificationSettings'})
export class NotificationSettingsPipe implements PipeTransform {
constructor(
public databaseService: DatabaseService,
public globalFunctions: GlobalFunctions,
public platform: Platform
) {}
transform(cards: Array<Object>) {
this.platform.ready().then((readySource) => {
return this.databaseService.getCategoriesForAllSoftware().then((data) => {
var softwareCategoryStates = this.globalFunctions.generateSoftwareCategoriesArray(data);
return cards.filter((card) => this.cardFilter(card, softwareCategoryStates));
}, (error) => {
console.error("Error in Pipe: ", error);
});
});
}
cardFilter(card, softwareNots) {
var flag = true;
for (var i=0; i<softwareNots.length; i++) {
if (card.softwareName == softwareNots[i]['softwareName']) {
console.debug("SOFTWARENOTS[I]", softwareNots[i]);
if (softwareNots[i]['onOffState'] == 0) {
flag = false;
} else {
var notificationTypes = softwareNots[i]['categories'];
for (var j=0; j<notificationTypes.length; j++) {
if (card.categoryName == notificationTypes[j]['categoryName']) {
console.debug("NOTIFICATIONTYPES[J]", notificationTypes[j]);
if (notificationTypes[j]['onOffState'] == 0) {
flag = false;
}
}
}
}
}
}
return flag;
}
}
:ここ
[
{
categories: [
{
categoryId: 0,
categoryName: "category1",
onOffState: 1
},
{
...
}
],
onOffState: 1,
softwareId: 0,
softwareName: "software1"
},
{
...
}
]
は私のパイプのためのコードであります
これは私のビューファイル上記のコードで
<div *ngFor="let card of (newsData | notificationSettings)">
<ion-card>
<ion-item>
<ion-icon name="{{card.icon}}" item-right></ion-icon>
<ion-avatar item-left>
<p class="product {{card.softwareName}}"></p>
</ion-avatar>
<h2>{{card.title}}</h2>
<p class="publish-date">{{card.date | date:'d MMM'}}</p>
</ion-item>
</ion-card>
</div>
でフィルタされたリスト項目を表示する必要があり、私は設定JSONはonOffStateを持っているのでnewsData項目は私のイオンリストに表示することを期待コードですソフトウェアとカテゴリの両方で1に設定します。現在のところ、私の配列のものはフロントエンドに表示されていません。
データベースから情報にアクセスしようとすると間違った方法があるかもしれませんが、プラットフォームの準備ができてデータベースからJSONデータが返された後にフィルタを使用しようとしているようです。
頻繁に変更すると思われますか?コンポーネント内のデータベースにアクセスし、 'softwareCategoryStates'を渡すことでパイプを純粋にする方が簡単かもしれません。また、あなたが投稿したコードの中で何が起こったのか、あなたは言わなかった。 – jonrsharpe
私はデータベースのJSONをパイプのパラメータとして渡してみましたが、データベースがデータの収集と返却を完了する前に、* ngForイテレータを評価しようとするパイプに苦労しているようでした。データベースオブジェクトのパラメータが更新されたときに、* ngForフィルタを更新する必要がありますか? –
'newsData'も観測から来ていますか?その場合、例えばこの2つを並行して実行し、両方の結果セットを収集するには、['forkJoin'](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md) '* ngFor'のために' newsData'を設定することができます。 – jonrsharpe