- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是 ngrx/store 的初学者,这是我使用它的第一个项目。
我已经成功地使用 ngrx/store 设置了我的 Angular 项目,并且我能够在像这样初始化我的主要组件后分派(dispatch)加载操作:
ngOnInit() { this.store.dispatch({type: LOAD_STATISTICS}); }
我已经设置了一个效果来在调度此操作时加载数据:
@Effect()
loadStatistic = this.actions.ofType(LOAD_STATISTICS).switchMap(() => {
return this.myService.loadStatistics().map(response => {
return {type: NEW_STATISTICS, payload: response};
});
});
我的 reducer 是这样的:
reduce(oldstate: Statistics = initialStatistics, action: Action): Statistic {
switch (action.type) {
case LOAD_STATISTICS:
return oldstate;
case NEW_STATISTICS:
const newstate = new Statistics(action.payload);
return newstate;
....
虽然这行得通,但我无法理解如何将它与路由器防护一起使用,因为我目前只需要分派(dispatch)一次 LOAD_ACTION。
此外,组件必须分派(dispatch) LOAD 操作以加载初始数据对我来说并不合适。我希望商店本身知道它需要加载数据,而我不必先发送操作。如果是这种情况,我可以删除组件中的 ngOnInit() 方法。
我已经研究过 ngrx-example-app,但我还没有真正理解它是如何工作的。
编辑:
在添加一个返回 ngrx-store observable 的 resolve guard 之后,路由没有被激活。这是解决方案:
@Injectable()
export class StatisticsResolver implements Resolve<Statistic> {
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Statistic> {
// return Observable.of(new Statistic());
return this.store.select("statistic").map(statistic => {
console.log("stats", statistic);
return statistic;
});
}
这是路线:
const routes: Routes = [
{path: '', component: TelefonanlageComponent, resolve: {statistic: TelefonieStatisticResolver}},
];
最佳答案
我不太明白为什么要通过解析器将解析后的数据发送到您的组件。设置 ngrx 存储的重点是拥有单一数据源。所以,您在这里要做的只是确保数据是真实的。休息,组件可以使用选择器从存储中获取数据。
我可以看到您正在从组件的 ngOnInit
方法中调用 LOAD_ACTION
。您不能调用一个操作来解析数据,然后在您调用该操作的 Init
上将数据导向组件!这就是您的路由器未加载路由的原因。
不确定你是否理解,但这是有道理的!
简单来说,你做的就是这个。您正在锁一个房间,然后将 key 从门下方的缝隙中插入,然后想知道为什么门打不开。
随身携带 key !
守卫的解析方法应该调用LOAD_ACTION
。然后解析应该等待数据加载,然后路由器应该继续到组件。
你是怎么做到的?
其他答案是设置订阅,但问题是你不想在你的守卫中这样做。在守卫中订阅不是好的做法,因为他们随后需要取消订阅,但如果数据未解析,或者守卫返回 false,则路由器永远无法取消订阅,我们就会一团糟。
所以,使用take(n)
。此运算符将从订阅中获取 n
值,然后自动终止订阅。
此外,在您的操作中,您将需要 LOAD_STATISTICS_SUCCESS
和 LOAD_STATISTICS_FAIL
。因为您的服务方法可能会失败!
在 reducer State
中,您需要一个 loaded
属性,当服务调用成功并且 时该属性变为
操作。true
调用 LOAD_STATISTICS_SUCCESS
在主 reducer 中添加一个选择器,getStatisticsLoaded
然后在您的 gaurd 中,您的设置将如下所示:
resolve(): Observable<boolean> {
this.store.dispatch({type: LOAD_STATISTICS});
return this.store.select(getStatisticsLoaded)
.filter(loaded => loaded)
.take(1);
因此,只有当 loaded 属性变为 true 时,filter 才会允许流继续。 take
将获取第一个值并传递。此时解析完成,路由器可以继续。
同样,take
将终止订阅。
关于angular - 如何将 ngrx/store 与 Angular 路由器防护装置连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42508097/
我的印象是 header guards 解决了重新定义的问题。我收到链接器错误,指出 .obj 文件中存在重新定义。这是我包含的 header ,问题在于所有全局声明的重新定义。 #ifndef DI
我正在 Microsoft Azure 中运行企业级应用程序。我想知道 Microsoft Azure 中 DDOS 投影的建议是什么。该文档明确指出该平台受到 DDOS 保护,但没有提供更多详细信息
我正在用 laravel sanctum 进行测试,但这里有一些问题.. 我正在创建管理员守卫。 当我将中间件更改为 auth:sanctum_admin .. 它应该只能由管理员访问,但在这里我可以
我有一个带有延迟加载模块的 Angular 4.3.6 应用程序。这是部分根路由器: const routes: Routes = [ { path: '', redirectTo: 'fleet
我有 Vaadin UI 的后端。我想保护后端数据库免受XSS攻击。对于 Vaadin UI 的 XSS 防护,您有何建议? 最佳答案 Vaadin 内置了 XSS 保护。所有组件都正确转义/编码 h
我正在尝试提高我的应用程序的安全性。每当我从用户(无论是通过 POST 还是 GET)接收到应该是整数的数据时,我都会适本地对其进行验证。但通常数据是 VARCHAR,有时可以包含 HTML。 在这种
我有一个具有此功能的服务,它会在 token 有效或无效时返回 true 或 false loggedIn() { return this.http.get('http://localhost:300
我们的应用程序中有几条路线,用户不应通过直接在浏览器的地址栏中输入网址来导航这些路线。 相反,当我们使用 router.navigate() 通过我们的应用程序逻辑以编程方式导航时,我们只想让它们可访
我通常在 .NET 中编写我的 SQL sql.Append("SELECT id, code, email FROM mytable WHERE variable = @variable "); 然
我需要同时将多行(1000 行)插入到 SQL Server 数据库中。我认为最好的方法是使用 SqlBulkCopy 但我不确定如何参数化插入查询以防止 SQL 注入(inject)。 你能帮我一下
Laravel 5.7 PHP 7.2.10 目前我可以使用 Web 和 api 防护中的任何一个,是否有任何方法可以同时允许两者,以便 Web 应用程序和 api 能够协同工作。 类似的东西 ret
Guard 总是因为这个问题而困扰我: .../gems/bundler-1.6.2/lib/bundler/runtime.rb:34:in `block in setup': You have a
我正在尝试通过 gmail api 从 Google 获取邮件 在收到 token 后对 Google_Client 进行身份验证时出现此错误 fatal error :未捕获异常“Google_Au
我是一名优秀的程序员,十分优秀!