iT邦幫忙

0

angular rxjs filter 怎麼用?

我有個 json file, 介面長這樣:

export interface EventModel {
  DATA_SEQ: number;
  WORK_DATE: Date;
  EMP_NAME: string;
  WORK_DESC: string;
}

然後我想用寫個畫面可以 filter 這個資料的內容。畫面有3個欄位:

https://ithelp.ithome.com.tw/upload/images/20190405/20017351U7y8mJyROq.png

目前已完成 service 的部份,程式碼如下

  searchEvents(from: Date, to: Date, keyword: string): Observable<EventModel[]> {
    if (from === undefined) { from = this.minDate; }
    if (to === undefined) { to = this.maxDate; }
    if (keyword === undefined) { keyword = ''; }

    this.events$ = this.httpClient.get<EventModel[]>('/./assets/Events.json');
    return this.events$.pipe(
      map((data: EventModel[]) => {
        const filterData = data.filter(evt => new Date(evt.WORK_DATE) >= from && new Date(evt.WORK_DATE) <= to)
          .filter(evt =>
            (((evt.EMP_NAME === null) ? '' : evt.EMP_NAME).indexOf(keyword) !== -1)
         || ((evt.WORK_DESC === null) ? '' : evt.WORK_DESC).indexOf(keyword) !== -1);

        return filterData;
      }));
    );
  }

雖然可以work, 但一直覺得程式碼很難看。
這2天試著改寫成

    return this.events$.pipe(
      map((evt: EventModel) => evt),![
      filter((evt: any) => new Date(evt.WORK_DATE) >= from && n](http://)ew Date(evt.WORK_DATE) <= to)
	  );

但return 的結果是空的。不知道是哪裡不對?

如果改成這樣,有錯誤訊息:
https://ithelp.ithome.com.tw/upload/images/20190405/20017351a7bjB2qLHZ.png

看更多先前的討論...收起先前的討論...
DanSnow iT邦新手 4 級 ‧ 2019-04-05 15:45:45 檢舉
你的 events$ 出來的東西不是 EventModel[] 嗎,怎麼變 EventModel 了
Brandon iT邦新手 4 級 ‧ 2019-04-05 18:04:08 檢舉
我如果用 EventModel[], 有錯誤訊息 (見內文最後的圖)
DanSnow iT邦新手 4 級 ‧ 2019-04-07 00:44:05 檢舉
我先確定一件事,你的那個 json 裡應該是陣列沒錯吧,那你的型態就該要是 EventModel[] ,接著你這邊其實並沒有必要去用 rxjs 的 filter ,如果一定要用的話,你會先需要用 concatAll 把 Observable emit 出來的東西從 EventModel[] 轉成 EventModel 再用 filter
Brandon iT邦新手 4 級 ‧ 2019-04-09 09:55:52 檢舉
弱弱的問一句:rxjs 的 filter 跟 typescript 的 filter 是不一樣的東西嗎?
DanSnow iT邦新手 4 級 ‧ 2019-04-09 23:28:01 檢舉
首先 typescript 本身沒有 filter 這個 function , typescript 只是加上了型態的 javascript ,而你說的 typescript 的 filter 是 Array 的方法 (method),它確實跟 RxJS 的 filter 不同,最大的差別在於它們是用在不同的東西上,一個是用在 js 的 Array 一個是用在 Observable

尚未有邦友回答

立即登入回答