$cache[$key] = empty($arr) ? NULL : $arr; return $cache[$key]; } // 门户 获取需要在频道显示的栏目主题数据 function portal_channel_thread($fid) { global $forumlist; if (empty($fid)) return NULL; $orderby = array('tid' => 1); $page = 1; // 遍历所有在频道显示内容的栏目 $category_forumlist = channel_category($fid); $arrlist = array(); $forum_tids = array(); $tidlist = array(); if ($category_forumlist) { foreach ($category_forumlist as &$_forum) { // 频道显示数据 $arrlist['list'][$_forum['fid']] = array( 'fid' => $_forum['fid'], 'name' => $_forum['name'], 'rank' => $_forum['rank'], 'type' => $_forum['type'], 'url' => $_forum['url'], 'channel_new' => $_forum['channel_new'], ); $forum_thread = thread_tid__find(array('fid' => $_forum['fid']), $orderby, $page, $_forum['channel_new'], 'tid', array('tid')); // 最新信息按栏目分组 foreach ($forum_thread as $key => $_thread) { $forum_tids[$key] = $_thread; } unset($forum_thread); } $tidlist += $forum_tids; } unset($category_forumlist); // 获取属性对应的tid集合 list($flaglist, $flagtids) = flag_thread_by_fid($fid); empty($flagtids) || $tidlist += $flagtids; unset($flagtids); // 频道置顶 $stickylist = sticky_list_thread($fid); empty($stickylist) || $tidlist += $stickylist; // 在这之前合并所有二维数组 tid值为键/array('tid值' => tid值) $tidarr = arrlist_values($tidlist, 'tid'); // 在这之前使用$tidarr = array_merge($tidarr, $arr)前合并所有一维数组 tid/array(1,2,3) if (empty($tidarr)) { $arrlist['list'] = isset($arrlist['list']) ? array_multisort_key($arrlist['list'], 'rank', FALSE, 'fid') : array(); return $arrlist; } $tidarr = array_unique($tidarr); $pagesize = count($tidarr); // 遍历获取的所有tid主题 $threadlist = well_thread_find_asc($tidarr, $pagesize); // 遍历时为升序,翻转为降序 $threadlist = array_reverse($threadlist); foreach ($threadlist as &$_thread) { // 各栏目最新内容 isset($forum_tids[$_thread['tid']]) AND $arrlist['list'][$_thread['fid']]['news'][$_thread['tid']] = $_thread; // 全站置顶内容 isset($stickylist[$_thread['tid']]) AND $arrlist['sticky'][$_thread['tid']] = $_thread; // 首页属性主题 if (!empty($flaglist)) { foreach ($flaglist as $key => $val) { if (isset($val['tids']) && in_array($_thread['tid'], $val['tids'])) { $arrlist['flaglist'][$key][array_search($_thread['tid'], $val['tids'])] = $_thread; ksort($arrlist['flaglist'][$key]); $arrlist['flag'][$_thread['tid']] = $_thread; } } } } unset($threadlist); if (isset($arrlist['sticky'])) { $i = 0; foreach ($arrlist['sticky'] as &$val) { ++$i; $val['i'] = $i; } } if (isset($arrlist['flag'])) { $i = 0; foreach ($arrlist['flag'] as &$val) { ++$i; $val['i'] = $i; } } if (isset($arrlist['flaglist'])) { foreach ($arrlist['flaglist'] as &$val) { $i = 0; foreach ($val as &$v) { ++$i; $v['i'] = $i; } } } isset($arrlist['list']) AND $arrlist['list'] = array_multisort_key($arrlist['list'], 'rank', FALSE, 'fid'); return $arrlist; } ?>angular - How to track changes in ngrxsignals store in a component - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

angular - How to track changes in ngrxsignals store in a component - Stack Overflow

programmeradmin0浏览0评论

I have signal store

export const Store = signalStore(
  withState(initialState),
  withMethods((store, userService = inject(UserService)) => ({
    getUser: rxMethod<string>(
      pipe(
        switchMap((id) => {
          return userService.get(id).pipe(
            tapResponse({
              next: (user) => patchState(store, { user }),
              error: console.error,
            })
          );
        })
      )
    ),
  }))
);

In component i use like

 public getUser(id: string): void{
    this.store.getUser(id)
  }

How can I track inside the component when the api call is completed, show notification for example?

Is it good practice to create status to track this api call?

type ArticlesState = {
  user: IUser;
  status: 'fulfilled' | 'loading' | 'error'
};

and handle it

 getUser: rxMethod<string>(
      pipe(
        tap(() => patchState(store, { status: 'loading'}),
        switchMap((id) => {
          return userService.get(id).pipe(
            tapResponse({
              next: (user) => patchState(store, { user, status: 'ful1filled' }),
              error: console.error,
            })
          );
        })
      )
    ),

I have signal store

export const Store = signalStore(
  withState(initialState),
  withMethods((store, userService = inject(UserService)) => ({
    getUser: rxMethod<string>(
      pipe(
        switchMap((id) => {
          return userService.get(id).pipe(
            tapResponse({
              next: (user) => patchState(store, { user }),
              error: console.error,
            })
          );
        })
      )
    ),
  }))
);

In component i use like

 public getUser(id: string): void{
    this.store.getUser(id)
  }

How can I track inside the component when the api call is completed, show notification for example?

Is it good practice to create status to track this api call?

type ArticlesState = {
  user: IUser;
  status: 'fulfilled' | 'loading' | 'error'
};

and handle it

 getUser: rxMethod<string>(
      pipe(
        tap(() => patchState(store, { status: 'loading'}),
        switchMap((id) => {
          return userService.get(id).pipe(
            tapResponse({
              next: (user) => patchState(store, { user, status: 'ful1filled' }),
              error: console.error,
            })
          );
        })
      )
    ),
Share Improve this question asked Feb 6 at 13:19 messmess 1 New contributor mess is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct. 1
  • I would say it is a good idea to write the result of your request into the store. You might also want to write the error state as well. You can have a look at the method withCallState from the ngrx-toolkit – kerosene Commented Feb 7 at 14:13
Add a comment  | 

1 Answer 1

Reset to default 0

I don't have much experience with signal store but there is nothing wrong with using status: 'fulfilled' | 'loading' | 'error' to track the current http status. I have used this technique a lot.

You can also use the new Resource API which came out in Angular 19 to track the status. Although I'm not sure how well it pairs with Signal store atm. It's still in experimental mode but I have used it with no trouble.

发布评论

评论列表(0)

  1. 暂无评论