2016-11-15 5 views
0

私はイオン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データが返された後にフィルタを使用しようとしているようです。

+0

頻繁に変更すると思われますか?コンポーネント内のデータベースにアクセスし、 'softwareCategoryStates'を渡すことでパイプを純粋にする方が簡単かもしれません。また、あなたが投稿したコードの中で何が起こったのか、あなたは言わなかった。 – jonrsharpe

+0

私はデータベースのJSONをパイプのパラメータとして渡してみましたが、データベースがデータの収集と返却を完了する前に、* ngForイテレータを評価しようとするパイプに苦労しているようでした。データベースオブジェクトのパラメータが更新されたときに、* ngForフィルタを更新する必要がありますか? –

+0

'newsData'も観測から来ていますか?その場合、例えばこの2つを並行して実行し、両方の結果セットを収集するには、['forkJoin'](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md) '* ngFor'のために' newsData'を設定することができます。 – jonrsharpe

答えて

0

あなたは非同期パイプは、DBからデータを取得の遅れを収容します非同期パイプ

https://angular.io/docs/ts/latest/guide/pipes.html#!#async-pipe

を実装する必要があります。

+0

非同期パイプを使用してコードを記述する方法の大まかな例はありますか?私は構文とその記述方法を理解するのに苦労しています。 –

+0

申し訳ありませんが、Angular2でまだ書き込む必要はありませんでした – danday74

0

私は問題を解決しましたが、パイプを使用するのではなく、データベースクエリを変更しました。残念ながら、それは私が提起した問題を解決しませんが、私はそれが必要な仕事をする回避策を見つけました。

私のデータベースクエリでは、WHERE句を使用して、表示したくないデータを除外するようになりました。

関連する問題