问题标签 [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 回答
687 浏览

angular - 如何在 angular2 中测试 ngrx/效果类?

我在下面有一个ngrx/效果类。我想测试它,但是当我运行测试时,它没有打印任何东西但仍然通过。测试应该是当我触发动作 TRIGGER_LOAD_NAVIGATION_ITEMS 时,我应该得到模拟结果集并返回动作类型为 LOAD_NAVIGATIONS_LINKS

效果文件

测试文件

测试应该失败,因为预期有效负载的长度是 1 并且在上面的语句中等于 3,所以它应该失败。但是测试通过了,但没有记录控制台输出。如何测试上述文件?

0 投票
1 回答
48 浏览

ngrx-effects - 我可以在 ngrx 商店中“挂钩”订阅吗

我想跟踪某个密钥在@ngrx/store 中订阅了多少次。我不想在每个订阅的组件中重复代码,但希望以某种方式连接到 select() 中。我认为@effects 不适用于这里,因为我没有查看已调度的操作。

有人对我将如何实现这一点有任何想法吗?

0 投票
1 回答
774 浏览

rxjs - 根据另一个 observable 的输出对 Observable 进行去抖动

我正在寻找合适的运算符和一种优雅的方法来根据另一个的输出时间来去抖动一个可观察的。

基本问题:

'如果在过去 3 秒内可观察到的 A 已发射,则对可观察到 B 的发射进行去抖动处理,直到这三秒过去'

此外,这适用于 NGRX 动作/效果的上下文中,在此上下文中重新表述基本问题会产生:

'根据另一个效果或动作的最近历史来消除效果'

0 投票
1 回答
2568 浏览

angular - ngrx/store 效果嵌套对象

我正在学习 Angular 2,我正在尝试使用 ngrx/store,但是在某些特殊情况下我遇到了一些困难。

示例 我正在尝试删除父对象。我想要做的是删除子对象。

这是我的实体:

我正在使用 normalizr 来展平我的状态,所以我存储的讨论将如下所示:

我有 3 个减速器,一个用于讨论,另一个用于帖子,最后一个用于评论。所有 reducer 都处理它自己类型的 delete Action。这是讨论减速器的示例:

我的动作是这样的:

当我删除讨论时,我想删除与讨论相关的帖子,帖子效果将删除与已删除帖子相关的评论。我使用了ngrx的效果,所以我使用了这个效果:

我的问题是如何从讨论 ID 中删除帖子?

谢谢阅读。

0 投票
0 回答
128 浏览

angular - 使用效果时,动作应该在组件中分发还是在商店中分发?

我在摸摸 echoes -player 的代码,里面的效果用的很干净,有一个效果player-dearch.effects就是监听PlayerSearchActions.SEARCH_MORE_FOR_QUERY,这个效果依次调用服务searchMore中。youtube.search有趣的部分是动作searchMoreForQuery是从youtube-videos.component.

问题:有人说最好将调度功能移至“youtube.search”服务,然后从youtube-videos.component. 那真的是更好的设计吗?有什么建议可以改进吗?

0 投票
1 回答
310 浏览

javascript - @ngrx/effects BehaviourSubject 为订阅者提供最后的价值

前几天我注意到了一些事情。我正在订阅Actions里面的流@ngrx/effects。我注意到(对我来说是一个问题)订阅Actions迟到的组件接收最后一个调度的操作。我可以看到这是因为内部的调度@ngrx/store程序是 aBehaviourSubject并引用了 RxJS 文档:

Rx.BehaviorSubject 类

表示随时间变化的值。观察者可以订阅主题以接收最后(或初始)值和所有后续通知。

不幸的是,我想订阅操作流而不检索最后一个值。它给我带来了一些问题,比如当用户返回页面时显示错误消息。

BehaviorSubjectSubject(我想要的方式)之间的区别在这里演示:

https://codepen.io/anon/pen/zwgype

有没有办法做到这一点?

0 投票
1 回答
308 浏览

javascript - 使用路由之间共享的数据填充 ngrx 存储

我有一个跨越多条路线的多页表格。所有路由都需要通过 API 与它们共享相同的数据。我可以将 API 的响应存储在里面ngrx/store,并使用效果触发 API 调用。我的问题更多关于在哪里启动 API 调用。一旦用户通过身份验证,就需要进行 API 调用,这发生在我点击的第一条路由上(在访问多页表单的第一部分之前)。我想出的两个选项是:

  1. 在每条路线的组件内触发效果意味着我每次访问路线时都必须请求信息。当用户未通过身份验证时,守卫将阻止所有页面的访问。

  2. 在 effect 中监听经过身份验证的成功操作,并向那里的 API 发出请求。

我敢肯定,两者都是完全可以接受的,并且各有取舍。能得到一些意见就好了!

0 投票
1 回答
932 浏览

angular - 如何捕获两个(或更多)@ngrx/store 操作并在组件中保持订阅,直到发生这种情况?

在我的主要组件中,我开始初始化我的数据:

这会触发所有初始化操作:

在商店中加载数据后,所有商店实体都会触发成功操作。

对于车辆:

对于字符:

最后,在触发所有 *_DATA_SUCCESS 操作之后,我希望触发我的 INITIALIZED 操作以将 READY 标志放入我的存储中。

我的问题 - 如何执行?如何知道何时触发了所有成功操作?

UPD

Snks mtx,我跟着你的第一个和更快的广告。

很抱歉有额外的问题,但我真的一直在寻找下一步的好方法。如何保持这个订阅(在组件内部)直到我的 INITIALIZED 动作被触发(需要用 if(vehicles.length>0) 移除这个可怕的拐杖):

我试图在subscribe() 之前插入 skipUntil( ),但现在我从另一个组件打开这个组件时遇到问题(当所有数据都已经加载时)。在这种情况下,订阅回调不能再触发了!我无法理解为什么...

要重现我的问题,只需按下列表中的一辆车。订阅回调未触发。然后按 F5 -> now vehicle loading,因为回调按设计触发。

完整的源代码在这里:GitHub ,在 GitHub Pages上运行的最后一个版本

0 投票
1 回答
392 浏览

angular - What is the right way to call in-between actions from inside @ngrs/effect code?

Need help to invoke side-effect actions, while my item saving in Firebase.

vehicle.service.ts:

vehicle.effects.ts:

0 投票
1 回答
3470 浏览

angular - 调度多个动作并等待完成发送下一个

我从一个效果返回多个动作, concatMap 按顺序发送动作,但不要等待完成发送下一个动作。loadDetails 在收到 loadDetailsS​​uccess 时调用 REST 服务并更新存储

我想在调用 HttpResultActions.httpRequestUpdateSuccessful() 之前完成 loadDetailsAction。

怎样才能做到这一点?来自不同的动作?