问题标签 [ngrx-store]

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 投票
0 回答
265 浏览

angular - 路由器保护不起作用

因此,我尝试关注 ngrx/example-app,并且堆放了路由器防护装置。我的警卫不起作用。

加载的属性存在于减速器中并被选中。сcode执行没有达到hasPlaylists函数所以我认为switchMap不起作用,但我不明白为什么=)

UPD:添加了路由器声明

UPD:我想我找到了解决方案。如果我使用地图而不是在这里过滤

并在这里采取行动:

UPD:正如@Skeptor 在评论中建议的那样,我不需要map获取元素,所以我可以在这里删除它

守卫工作正常,但我仍然不明白为什么它不能与过滤器一起使用=/

0 投票
0 回答
206 浏览

angular - Angular 动态控件、@ngrx/store 和单向数据绑定:控件永远不会被标记为“脏”

我正在使用@ngrx/store并进行单向数据绑定。

我有一个愚蠢的组件,它获取值列表为@Input(). 基于这个列表,我创建了一个FormArrayofFormControl来允许用户输入。ngOnChanges如果我SimpleChanges为值列表提供了新值,我会这样做。

由于单向数据绑定,每次用户输入一个字符时,都会向 store 发送一个动作,并且值列表会ngOnChanges再次出现。由于FormArray重新创建了,它不会保留dirtyandpristine属性。他们被重置。

我正在使用trackBy.

属性的值对dirty我来说很重要,因为我使用它来决定是否显示验证警报。

知道如何解决这个问题吗?

我有一个显示问题的 plunker。我使用了 BehaviorSubject 来伪造@ngrx/store。请尝试在任何输入控件中输入值并观察dirtypristine,如图所示:https ://plnkr.co/edit/xZmU4ww8Y9PEgFOCOOw4?p=info

0 投票
1 回答
112 浏览

angular - 如何使用来自先前 http 请求的数据发出 http 请求?

我有一个 Issue 对象,其中一个属性是 Tool 对象数组。问题和工具是我数据库中的两个不同的表。

在我的问题日志组件中,我正在调度一个操作来搜索与我的搜索查询匹配的问题。这工作得很好。

我一直在尝试做的下一件事是获取问题列表和每个问题 ID,将其传递给我的工具服务,以便我可以获得与该问题相关的工具。

我能够让它工作的方法是添加另一个监听 ISSUE.SEARCH.COMPLETE 动作的效果。然后我遍历了我的工具服务中的一系列问题,以便我可以为每个问题 ID 调用 API 服务并将工具属性添加到该问题。这在几个方面似乎是错误的。一个是对于大量问题,加载所有工具需要很长时间,如果我尝试启动另一个问题搜索,我必须等待工具从前一个工具加载,然后我的应用程序响应。第二,当我的工具 API 一次只需要一个问题 ID 来获取与该问题相关的工具列表时,将整个问题数组传递到工具服务似乎是错误的;这不会使我的工具服务在我的应用程序的其他地方轻松重复使用。

我不希望等到完成获取问题列表的 API 调用后,才能开始获取与每个问题 ID 关联的工具。是否可以在我的问题搜索 $ 效果中添加代码(在下面评论的地方),以便在构建我的问题列表时开始添加工具?

零件:

影响:

我也尝试从我的问题服务中调用我的工具服务,但也不认为这是正确的方法。

0 投票
2 回答
4242 浏览

javascript - Show navigation loader spinner with delay in angular 2+

I'm new to angular 2+ and RxJS, trying to get used to RxJS.

I show load spinner on route transitions, but only if it takes more then certain amount time, lats say 160ms
I have a load spinner as a separate component, with subscription to ngrx store, so I show/hide load spinner based on value in the sore (showSpinner)

In my app root component, I subscribe to router change events, and dispatch actions (SHOW_SPINNER/HIDE_SPINNER)
So the question is, Is there a simpler way to achieve it?

Here are parts of my code

....

0 投票
1 回答
262 浏览

angular - 类似于动作的返回值

我想知道是否有最佳实践来模拟类似 ngrx Action 的返回值之类的东西。

假设我有一个用于创建新地址的通用组件。这可以从整个应用程序的多个位置调用:

然后,当用户输入所有地址信息并保存地址时,呼叫者 - 并且只有呼叫者 - 应该得到通知并更新自己(例如,将地址添加到组合框或以文本形式在摘要中显示)。

因此,Store 中的单个字段“latestCreatedAddress”是不够的。我需要多个字段,每个字段用于每个调用者。

有没有一些聪明的方法来处理这样的案例?

0 投票
2 回答
505 浏览

angular - 加载硬编码数据时,ngrx/store 无法正常工作

我试图在我的 Angular 应用程序中使用 ngrx/store 几个小时,但我不知道我做错了什么。我的商店商品似乎永远不会更新。

这是我的商店界面:

Item 是一个自定义对象 - 这是模型:

我有一个作为中央集线器的服务,它包含主要的“项目”数组和一个加载数据的函数“loadItems()”(从另一个组件调用):

这是我调用'loadItems'的主要应用程序组件;

这是我的减速器功能:

以及我用来测试“项目”是否已更新的 html(它是一个简单的 div,它根据项目的大小绘制特定数量的按钮,在运行我的代码并加载手动数据后应该是 2) :

知道发生了什么吗?我对ngrx/store 完全陌生,我读过的教程并没有太大帮助——它们似乎都有语法错误,有时已经过时了。

0 投票
1 回答
760 浏览

angular - Angular 4 中的“Reducer”类型不是通用的

我对 Angular 很陌生,我的第一个项目是将 Angular 2 应用程序转换为最新版本。我被困在这个错误上:

另一个似乎相关的错误:

我不知道如何处理错误:“考虑用对导出函数的引用替换函数或 lambda”

我已将整个应用程序最小化为一个仍然会产生错误的模块:

这是我正在使用的软件(使用 npm outdated 命令)

其他依赖:

我已经用谷歌搜索并尝试过,但没有解决方案。好奇你怎么想!

0 投票
1 回答
1920 浏览

c# - ngrx store - 正确更新数组。

我在我的应用程序中使用 ngrx/store,但无法保存数组。我的数组在启动时设置为空:

我正在尝试使用以下函数手动为其提供两个 CustomObjects 的数组:

调用此函数会调度对我的 reducer 函数的调用:

export const mainReducer: ActionReducer = (state: AppState, action: Action) => {

}

这一切看起来都很好,但是我的主要应用程序组件的数组没有得到这两个对象。如果我手动将默认状态设置为具有这两个 CustomObjects,那么它就可以工作(我不能这样做,因为我需要能够随时更新数组)。我的 HomeComponent 使用:

我已经分析了我的对象,我希望看到“this.customObjects$”最终成为两个 CustomObjects 的数组。相反,它是一个 ScalarOservable:

ScalarObservable {_isScalar: true, value: undefined, scheduler: null} 等等等等。

注意 - 我不确定是否需要,但我已将 ChangeDetectionStrategy.onPush 包含在我的主组件的 @Component 部分中。我也确保使用

在我的 app.module 类中。

有谁知道我做错了什么以及为什么 'this.customObjects$' 不是两个对象数组?我是 ngrx/store 的新手——我觉得我的 reducer 函数设置数组的方式存在问题,但我不确定。

0 投票
2 回答
2616 浏览

angular - NGRX 和子组件的状态管理

目前正在重构 Angular 应用程序以使用 ngrx 存储并有两个选项。这是我们应用程序的基本结构。我相信大多数 Angular 应用程序都是以相同的方式构建的:

ContainerComponent 已注入Store<AppState>。我要解决的问题是 GrandGrandChildComponent(例如,DropDownMenu 组件)必须根据应用程序的状态更改其行为(即在商店中发生的某些条件下禁用某些菜单项)并在单击时发出事件在菜单项上,以便ContainerComponent(或任何其他组件,不是必需的祖先)可以对其做出反应。

有几种解决方法:

  1. @Input使用/在组件之间进行通信@Output
  2. 注入Store任何需要知道状态的组件

选项 1 是我在文档中读到的最常见/推荐的模式。所以只有 ContainerComponent 是胖的,所有的孩子都是瘦的/笨的,并且依赖于通过@Input.

但据我所知,这种方法添加了很多样板文件,您必须添加不必要的属性才能将状态传递给 Grand Child 组件。而且它还打破了关注点分离原则,因为任何中间组件都必须知道下面的组件需要什么。而且,如果它知道只有 Grand Components 上可用的详细信息,则制作通用组件并不容易。

另一方面,方法 2 似乎解决了分离关注点的问题,而且它似乎也是更清洁的实现。但由于我在使用redux模式方面相对较新,所以我不确定这是否是正确的方法,也许我不知道当我在重构方面过于深入时可能会遇到任何陷阱。

IMO,这两种方法都提供了一种简单的方法来测试每个组件,这对我来说非常重要。

我很怀疑采取哪种方法。我应该注意哪些陷阱?

谢谢

0 投票
2 回答
2765 浏览

angular - 如何调度具有当前状态值的动作?

我有一个角度组件显示列表中的项目。每个 itemn 都可以被选中,并且选中的 item 的 id 将被存储在 state 中。所以我的状态对象看起来像这样:

现在我得到了一个名为DeleteSelectedAction作为selected有效负载的动作。此操作将使用效果调用某些 WebAPI,依此类推。

现在我找到了两种方法可以做到这一点。

第一:从商店中选择selected并订阅它并通过操作传递值

第二:不向操作传递任何值,但获取selected有效的

我不喜欢第一种方式,因为我需要使用订阅并且需要正确取消订阅。第二种方法是可以的,但只有当动作有副作用时。所以现在我正在寻找第三种方法。在我看来,这种方式如下所示:

我怎么能用 rxjs 运算符得到类似的东西?