有什么方法可以在NGRX(Angular)上的还原器中重复使用实体数据,以便没有多个API调用?

发布于 2025-02-08 23:26:57 字数 1639 浏览 1 评论 0原文

有什么方法可以连接NGRX实体中的选择器和还原器?目前,我每次发送操作并进入还原器的这一部分时,我都在做一个API呼叫:

export class SearchComponent {
  constructor(private moviesService: MoviesService, private store: Store) {}

  searchFieldChanged(query: string) {
    this.moviesService
      .getMovies()
      .subscribe((movies) =>
        this.store.dispatch(retrievedMovieListFiltered({ movies, query }))
      );
  }
}

export const moviesReducer = createReducer<PopularMovieState>(
  initialState,
  on(retrievedMovieList, (state, { movies }) =>
    movieAdapter.addMany(movies, state)
  ),
  on(retrievedMovieListFiltered, (state, { movies, query }) =>
    movieAdapter.setAll(
      movies.filter((movie) => movie.title.includes(query)),
      { ...state }
    )
  )

我想找到一种方法,每次用户键入字符时,都可以在不提供API调用的情况下进行查询。

换句话说,有什么办法可以使用我编写的其他选择器(最后一个):

export const moviesFeatureSelector =
  createFeatureSelector<PopularMovieState>('movies');

const { selectEntities, selectAll } = movieAdapter.getSelectors();

export const selectMoviesEntities = createSelector(
  moviesFeatureSelector,
  selectEntities
);

export const selectMovies = createSelector(moviesFeatureSelector, selectAll);

export const selectMovie = createSelector(
  selectMoviesEntities,
  selectRouteParams,
  (movies, { movieId }) => movies[movieId]
);

export const selectFilteredMovies = (title: string) =>
  createSelector(selectMovies, (movies) =>
    movies.filter((movie) => movie.title.includes(title))
  );

并将其应用于还原器?我的意思是,我需要更新是否正确解释。

如果是USEFU,我可以提供我的回购链接

is there any way to connect a selector and a reducer in ngRx entities ? At the moment I am doing an API call each time I send the action and enters to this part of the reducer:

export class SearchComponent {
  constructor(private moviesService: MoviesService, private store: Store) {}

  searchFieldChanged(query: string) {
    this.moviesService
      .getMovies()
      .subscribe((movies) =>
        this.store.dispatch(retrievedMovieListFiltered({ movies, query }))
      );
  }
}

.

export const moviesReducer = createReducer<PopularMovieState>(
  initialState,
  on(retrievedMovieList, (state, { movies }) =>
    movieAdapter.addMany(movies, state)
  ),
  on(retrievedMovieListFiltered, (state, { movies, query }) =>
    movieAdapter.setAll(
      movies.filter((movie) => movie.title.includes(query)),
      { ...state }
    )
  )

.

I would like to find a way to filter among the movies array with the query provided without doing an API call each time the user types a character.

In other words, is there any way I could use this other selector I have written (last one):

export const moviesFeatureSelector =
  createFeatureSelector<PopularMovieState>('movies');

const { selectEntities, selectAll } = movieAdapter.getSelectors();

export const selectMoviesEntities = createSelector(
  moviesFeatureSelector,
  selectEntities
);

export const selectMovies = createSelector(moviesFeatureSelector, selectAll);

export const selectMovie = createSelector(
  selectMoviesEntities,
  selectRouteParams,
  (movies, { movieId }) => movies[movieId]
);

export const selectFilteredMovies = (title: string) =>
  createSelector(selectMovies, (movies) =>
    movies.filter((movie) => movie.title.includes(title))
  );

and apply it to the reducer ? I mean, I need to update the not sure if I am explaining correctly.

I can provide my repo link if it is usefu

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

深海蓝天 2025-02-15 23:26:57

由于您在NGRX之外执行请求,因此可以在组件初始化时加载电影,然后在用户输入上过滤它们

export class SearchComponent {
  constructor(private moviesService: MoviesService, private store: Store) {}

  ngOnInit(){
    this.moviesService
      .getMovies()
      .subscribe((movies) =>
        this.movies = movies
      );
  }

  movies: any[] = [];

  searchFieldChanged(query: string) {
    this.store.dispatch(retrievedMovieListFiltered({ this.movies, query })) 
  }
}

Since you are doing the request outside of ngrx you can just load the movies when the component initializes, and filter them on user input

export class SearchComponent {
  constructor(private moviesService: MoviesService, private store: Store) {}

  ngOnInit(){
    this.moviesService
      .getMovies()
      .subscribe((movies) =>
        this.movies = movies
      );
  }

  movies: any[] = [];

  searchFieldChanged(query: string) {
    this.store.dispatch(retrievedMovieListFiltered({ this.movies, query })) 
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文