问题标签 [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.
angular - ngrx/效果,中间件或元减速器
在ngrx/store的综合介绍中多次提到
中间件已在 ngrx/store v2 中删除。请参阅 meta-reducers 部分了解如何创建类似的功能。
我的问题是,既然 ngrx/effects 是中间件(或者不是?)那么这个项目是否存在或是否会有任何副作用(请原谅双关语)?
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”并知道正确的“基本”路由用于路由到日历功能区域
有没有其他干净的方法来实现这个?不同的模块结构/层次结构?
如果不是,有任何支持或反对我的两个潜在实现的论据吗?关于如何最好地实施的建议?
谢谢
javascript - 如何在angular2应用程序中使用ngrx-effects从商店返回分页数据或来自api服务的新数据?
我的问题是这个关于 redux 存储中分页数据形状的优秀问答的延续。我在 Angular 2 应用程序中使用 ngrx/store。
基于上述形状,我相信如果来自传入请求有效负载的偏移量(或页面、排序等)发生变化,那么可见用户以及通过调用数据库的用户实体都会发生变化。我有一些动作和减速器功能来处理这个问题,它按预期工作。如果偏移量保持不变并且用户以离开页面的方式返回页面,则用户实体应该由商店而不是数据库返回。
我苦苦挣扎的地方是该逻辑的放置位置以及使用哪些 rxjs 运算符(仍在学习这一点)。
我认为正确的地方是一种效果。这是我现在在我的 angular2 应用程序中拥有的内容(我正在注入 Actions、Store 和我的 UserService),每次加载页面时都会提取新数据。
我最好的主意是这样的:
不知道如何使这项工作。提前谢谢。
angular - 在 Ionic 应用程序中使用 ngrx/store 进行顶级导航
我有一个应用程序,它在加载时具有我称之为非常常见的导航模式。这些是规则:
- 当应用程序打开时,导航到 LoadingPage。
storage
从...加载 - 从商店检索信息后...
- 如果
storage.completedOnboarding
是false
,请导航到 OnboardingPage - 如果
storage.completedOnboarding
是true
,导航到主页
- 如果
- 从 OnboardingPage,您可以导航到 CreateAccountPage、LoginPage 或 HomePage 中的任何一个。从 OnboardingPage 导航
completedOnboarding
到true
.
本质上,用户应该只在他们第一次加载应用程序时看到 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-- 您可以通过设置completedOnboarding
为false
例如第一次加载页面时看到这一点。然后点击底部的任一“Go To”按钮都会更新目标导航页面,但是你会看到上次运行的操作仍然是Completed Onboarding
. 我们确实需要在用户进入主页/登录页面时完成入职,但它也应该将他们导航到该页面,即在该状态链中执行的最后一个操作。
angular - 从内部地图返回主题
将此作为对此的跟进(如何从订阅返回可观察的),因为接受的解决方案没有解决我的用例这是我的代码
控制台上的输出是:
开始搜索:对象 {player: Object, nowPlaylist: Object, nowChannellist: Object, user: Object, search: Object…}
输入搜索全部
PS:如果我直接调用 search()(它将有一个硬编码通道)而不是 searchAll(),则上述方法有效,如果我可以直接链接多个对 search() 的调用,然后将它们合并为@Effect()searchQuery$
自身的一部分,我也很好。
ngrx - 使用 ngrx 效果优雅地处理错误
我有一个场景,当发生 http 端口错误时,效果会被取消订阅,并且不再起作用。例如,
假设发生错误,它会显示在消息部分的 UI 中。但是在那之后,发送新消息(发布)按钮不会再发布另一个帖子,因为不再订阅效果。知道如何优雅地处理这个问题吗?
javascript - 如何在ngrx中链接调度?
例如
在上面的代码中,我希望第二次调度仅在完成所有减速器和第一个效果后才开始。调度是异步的,但没有返回任何东西,也没有证明回调,我无法轻易弄清楚如何做到这一点。
ngrx - 用户注销时从 ngrx/redux 存储中清除状态的问题
我的应用程序使用ngrx/rxjs。我依靠 ngrx 效果从商店中注销和清除状态。
不幸的是,因为我的一个组件通过选择器订阅了商店(见下文:)getLatestMessagesByCounterParty
,并且因为在该组件被销毁之前清除了状态,所以我收到以下错误:
错误类型错误:无法在 getCurrentUserAccountId 处读取 null 的属性“id”
...表示 is ,这currentUserAccount
是null
非常合乎逻辑的,因为我刚刚从商店中清除了状态。
这是signout$
效果:
这是订阅登录状态的组件:
以及相关的选择器:
我正在寻找关于何时、何时以及如何从商店中清除状态的最佳实践。理想情况下,我希望在订阅组件已被销毁的最后时间这样做。
有人可以建议吗?
编辑:让我进一步完善我的评论。我上面的代码应该如下所示。
angular - Ngrx 效应被无限期调用
我编写了 Effect 用于从 API 加载类别项目,但我的 effect 被无限期调用。我应该做什么:
- 仅加载一次类别列表。
- 如果 API 没有响应,则类别列表为空。
我注意到类别已正确加载,但请求被无限期执行。
下面我放代码:
类别.效果.ts
类别.service.ts
app.module.ts
angular - 查询组件模板
假设我有一个组件 ListOptionsMenu,该组件通过其输入接收 1 个菜单的选项列表。
现在假设在一个视图中有 4 个菜单,那么我使用ListOptionsMenu模板,但在创建另一个ListFatherOptionsMenu组件来控制数据的逻辑之前。
在ListFatherOptionsMenu中,我在它的构造函数中有一个menuService,在它的 ngOnInit 中的 this ,根据类型this.menuService.getOptions(type) 调用负责带菜单选项数据的服务的方法; 然后父组件将它从服务中获取的选项传递给子组件,这没有问题,4个菜单中的每一个都有其对应的选项。
现在假设我想动态更改菜单选项,我单击一个允许我登录的菜单选项,登录面板打开并且 4 个菜单仍然在同一个视图中,只需更改正文,我登录就来了问题,一旦我成功登录,我想通过对 api 的新调用来更改 2 个菜单的选项列表,1 将菜单从登录注册更新为注销(我知道很简单),另一个更新用户进入时的主菜单。
然后在ListFatherOptionsMenu中可以使用服务之间的通信将它与一些 observable 链接起来,或者使用 redux 与ngrx / store和ngrx / effects,这里的问题是这个组件不知道将从 observable 收集的数据发送给谁,并且如果发送,则在 4 个子组件中进行复制。
然后我决定删除这个父组件并控制来自相同子组件的数据逻辑。
但是这里的问题是一样的,如果我将 observable 连接到服务(登录)以更改数据(通过服务调用 api),或者使用 redux(存储),这在构造函数中,所有ListOptionsMenu都相同,然后在任何更改时都会影响 4 个组件。
我想也许在构造函数中添加一个开关,并根据菜单的类型加载适当的 store/observable,可以解决这个问题,所以当用户登录时,menuA、storeA 被加载,B store B 和 Other 没有更改没有加载任何商店,但是我认为这不是一个很干净的选择。
我需要帮助来了解如何在这种情况下控制信息流,因为它不仅扩展到许多选项,而且扩展到任何类型的组件,这些组件需要作为其他服务的模板。
任何形式的帮助,在此先感谢。