问题标签 [ngrx-effects]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2012 浏览

angular - ngrx/效果,中间件或元减速器

ngrx/store的综合介绍中多次提到

中间件已在 ngrx/store v2 中删除。请参阅 meta-reducers 部分了解如何创建类似的功能。

我的问题是,既然 ngrx/effects 是中间件(或者不是?)那么这个项目是否存在或是否会有任何副作用(请原谅双关语)?

0 投票
0 回答
436 浏览

angular - 如何在Angular2中执行相对于父模块的路由

我正在使用 @ngrx 和 @ngrx/router-store 开发 Angular2 应用程序,用于路由操作。

我正在尝试重组应用程序以尝试遵循指南中描述的模块路由指南:https ://angular.io/docs/ts/latest/guide/router.html#!#crisis-child-routes

我正在构建的应用程序允许用户登录特定“位置”的帐户。用户登录后,URL 包含当前位置作为开始,类似于登录 Gmail 时显示的用户/帐户:https://mail.google.com/mail/u/0/

以下是路线的大致轮廓:

现在,我希望各个功能模块(主页、日历、客户端)不必知道路线中的“它们所在的位置”(即它们不知道它们是否作为 '/' 或 ' 的子级存在/位置/:ID'。

只要要素之间没有路线,这很好。但是,在某些情况下,有必要在功能区域/模块之间导航(我正在尝试最小化这些)。例如,“home”组件上有一个链接应该路由到日历。

我唯一的想法是(我都不太喜欢):

  • LocationModule在子模块用于路由的级别提供的服务:
  • 一个@ngrx 效果“外部”HomeModule触发动作“SELECT_CALENDAR”并知道正确的“基本”路由用于路由到日历功能区域

有没有其他干净的方法来实现这个?不同的模块结构/层次结构?

如果不是,有任何支持或反对我的两个潜在实现的论据吗?关于如何最好地实施的建议?

谢谢

0 投票
1 回答
1897 浏览

javascript - 如何在angular2应用程序中使用ngrx-effects从商店返回分页数据或来自api服务的新数据?

我的问题是这个关于 redux 存储中分页数据形状的优秀问答的延续。我在 Angular 2 应用程序中使用 ngrx/store。

基于上述形状,我相信如果来自传入请求有效负载的偏移量(或页面、排序等)发生变化,那么可见用户以及通过调用数据库的用户实体都会发生变化。我有一些动作和减速器功能来处理这个问题,它按预期工作。如果偏移量保持不变并且用户以离开页面的方式返回页面,则用户实体应该由商店而不是数据库返回。

我苦苦挣扎的地方是该逻辑的放置位置以及使用哪些 rxjs 运算符(仍在学习这一点)。

认为正确的地方是一种效果。这是我现在在我的 angular2 应用程序中拥有的内容(我正在注入 Actions、Store 和我的 UserService),每次加载页面时都会提取新数据。

我最好的主意是这样的:

不知道如何使这项工作。提前谢谢。

0 投票
0 回答
927 浏览

angular - 在 Ionic 应用程序中使用 ngrx/store 进行顶级导航

我有一个应用程序,它在加载时具有我称之为非常常见的导航模式。这些是规则:

  1. 当应用程序打开时,导航到 LoadingPage。storage从...加载
  2. 从商店检索信息后...
    1. 如果storage.completedOnboardingfalse,请导航到 OnboardingPage
    2. 如果storage.completedOnboardingtrue,导航到主页
  3. 从 OnboardingPage,您可以导航到 CreateAccountPage、LoginPage 或 HomePage 中的任何一个。从 OnboardingPage 导航completedOnboardingtrue.

本质上,用户应该只在他们第一次加载应用程序时看到 OnboardingPage。

当用户离开 OnboardingPage 时,它​​应该设置storage.completedOnboarding = true. 我订阅了completedOnboarding我商店中的切片,以确定在应用加载时用户应该导航到 HomePage 还是 OnboardingPage。

我遇到的问题是,当我更新商店以导航到 CreateAccountPage 或 LoginPage 时,这也会storage.completedOnboarding在执行导航true 后更新。

在入职组件中,我有:

然后在我的效果中,我有:

本质上,我想completedOnboarding在导航到新页面的同时进行更新。一旦载入状态写入存储,SET_ONBOARDING_STATUS_COMPLETE就会触发更新存储的操作。这发生 NAVIGATE_ACCOUNT_PAGE. 从本质上讲,Effect它会触发这些状态:

为了解决这个问题,我在基于completedOnboarding切片导航之前检查用户当前所在的页面:

这可行,但我宁愿不必进行这些额外的条件检查。在某些情况下,我希望能够在触发入职/主页上的检查的情况下更新completedOnboarding状态。

有没有办法在没有额外的条件检查的情况下做到这一点?

Example Plunker-- 您可以通过设置completedOnboardingfalse例如第一次加载页面时看到这一点。然后点击底部的任一“Go To”按钮都会更新目标导航页面,但是你会看到上次运行的操作仍然是Completed Onboarding. 我们确实需要在用户进入主页/登录页面时完成入职,但它也应该将他们导航到该页面,即在该状态链中执行的最后一个操作。

0 投票
1 回答
1330 浏览

angular - 从内部地图返回主题

将此作为对此的跟进(如何从订阅返回可观察的),因为接受的解决方案没有解决我的用例这是我的代码

控制台上的输出是:

开始搜索:对象 {player: Object, nowPlaylist: Object, nowChannellist: Object, user: Object, search: Object…}

输入搜索全部

PS:如果我直接调用 search()(它将有一个硬编码通道)而不是 searchAll(),则上述方法有效,如果我可以直接链接多个对 search() 的调用,然后将它们合并为@Effect()searchQuery$自身的一部分,我也很好。

0 投票
1 回答
284 浏览

ngrx - 使用 ngrx 效果优雅地处理错误

我有一个场景,当发生 http 端口错误时,效果会被取消订阅,并且不再起作用。例如,

假设发生错误,它会显示在消息部分的 UI 中。但是在那之后,发送新消息(发布)按钮不会再发布另一个帖子,因为不再订阅效果。知道如何优雅地处理这个问题吗?

0 投票
0 回答
948 浏览

javascript - 如何在ngrx中链接调度?

例如

在上面的代码中,我希望第二次调度仅在完成所有减速器和第一个效果后才开始。调度是异步的,但没有返回任何东西,也没有证明回调,我无法轻易弄清楚如何做到这一点。

0 投票
1 回答
804 浏览

ngrx - 用户注销时从 ngrx/redux 存储中清除状态的问题

我的应用程序使用ngrx/rxjs。我依靠 ngrx 效果从商店中注销和清除状态。

不幸的是,因为我的一个组件通过选择器订阅了商店(见下文:)getLatestMessagesByCounterParty,并且因为在该组件被销毁之前清除了状态,所以我收到以下错误:

错误类型错误:无法在 getCurrentUserAccountId 处读取 null 的属性“id”

...表示 i​​s ,这currentUserAccountnull非常合乎逻辑的,因为我刚刚从商店中清除了状态。

这是signout$效果:

这是订阅登录状态的组件:

以及相关的选择器:

我正在寻找关于何时、何时以及如何从商店中清除状态的最佳实践。理想情况下,我希望在订阅组件已被销毁的最后时间这样做。

有人可以建议吗?

编辑:让我进一步完善我的评论。我上面的代码应该如下所示。

0 投票
0 回答
130 浏览

angular - Ngrx 效应被无限期调用

我编写了 Effect 用于从 API 加载类别项目,但我的 effect 被无限期调用。我应该做什么:

  1. 仅加载一次类别列表。
  2. 如果 API 没有响应,则类别列表为空。

我注意到类别已正确加载,但请求被无限期执行。

下面我放代码:

类别.效果.ts

类别.service.ts

app.module.ts

0 投票
0 回答
59 浏览

angular - 查询组件模板

假设我有一个组件 ListOptionsMenu,该组件通过其输入接收 1 个菜单的选项列表。

现在假设在一个视图中有 4 个菜单,那么我使用ListOptionsMenu模板,但在创建另一个ListFatherOptionsMenu组件来控制数据的逻辑之前。

ListFatherOptionsMenu中,我在它的构造函数中有一个menuService,在它的 ngOnInit 中的 this ,根据类型this.menuService.getOptions(type) 调用负责带菜单选项数据的服务的方法; 然后父组件将它从服务中获取的选项传递给子组件,这没有问题,4个菜单中的每一个都有其对应的选项。

现在假设我想动态更改菜单选项,我单击一个允许我登录的菜单选项,登录面板打开并且 4 个菜单仍然在同一个视图中,只需更改正文,我登录就来了问题,一旦我成功登录,我想通过对 api 的新调用来更改 2 个菜单的选项列表,1 将菜单从登录注册更新为注销(我知道很简单),另一个更新用户进入时的主菜单。

然后在ListFatherOptionsMenu中可以使用服务之间的通信将它与一些 observable 链接起来,或者使用 redux 与ngrx / storengrx / effects,这里的问题是这个组件不知道将从 observable 收集的数据发送给谁,并且如果发送,则在 4 个子组件中进行复制。

然后我决定删除这个父组件并控制来自相同子组件的数据逻辑。

但是这里的问题是一样的,如果我将 observable 连接到服务(登录)以更改数据(通过服务调用 api),或者使用 redux(存储),这在构造函数中,所有ListOptionsMenu都相同,然后在任何更改时都会影响 4 个组件。

我想也许在构造函数中添加一个开关,并根据菜单的类型加载适当的 store/observable,可以解决这个问题,所以当用户登录时,menuA、storeA 被加载,B store B 和 Other 没有更改没有加载任何商店,但是我认为这不是一个很干净的选择。

我需要帮助来了解如何在这种情况下控制信息流,因为它不仅扩展到许多选项,而且扩展到任何类型的组件,这些组件需要作为其他服务的模板。

任何形式的帮助,在此先感谢。