Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular ngrx中单独减速器中的相关实体_Angular_Redux_Ngrx - Fatal编程技术网

Angular ngrx中单独减速器中的相关实体

Angular ngrx中单独减速器中的相关实体,angular,redux,ngrx,Angular,Redux,Ngrx,我正在angular开发我的第一个ngrx应用程序,但与相关实体存在问题。我有两个减缩器,一个叫做Page,另一个叫做Section。下面是结构的简化版本。section对象有一个PageID的pages数组,该数组指向页面缩减器中的页面 // section.reducer.ts sections: { 1: { id: 1, title: 'Section 1', pages: [1,2,3] } } // page.redu

我正在angular开发我的第一个ngrx应用程序,但与相关实体存在问题。我有两个减缩器,一个叫做Page,另一个叫做Section。下面是结构的简化版本。section对象有一个PageID的pages数组,该数组指向页面缩减器中的页面

// section.reducer.ts
sections: {
    1: {
        id: 1,
        title: 'Section 1',
        pages: [1,2,3]
    }
}

// page.reducer.ts
pages: {
    1: {
        id: 1,
        title: 'Page 1'
    },
    2: {
        id: 2,
        title: 'Page 2'
    }
    3: {
        id: 3,
        title: 'Page 3'
    }
}
当我想添加一个新页面并将其添加到一个部分时,我正在努力解决这个问题。我的第一个想法是分派一个AddPage操作并在两个reducer中处理它。问题是页面对象是在页面缩减器中创建的,因此节缩减器不知道它。我必须至少在分区中有pageId。然后,我认为我可以使用新创建的页面发送AddPageSuccess,以便节缩减器可以处理它。这种方法的问题是,在reducer中没有对存储的引用,因此我无法分派任何操作。因此,我尝试将其添加为@效果。这可能会奏效,但我不确定这是否是“正确”的方法。我的印象是,效果应该用于异步数据,比如rest调用。在这种情况下,所有操作都是同步的,但操作相互依赖。@effects是实现动作相互依赖场景的“有效”方法,还是这种设计是错误的


另一种方法是将所有状态都放在同一个减速器中,但减速器将非常庞大,因为每个部分都有很多逻辑

效果是副作用,在我看来,你所想的效果解决方案是完全正确的。您正在添加页面,但该部分也应该注意这一点。这肯定是副作用,对吗?所以,效果是一个很好的解决方案。

效果是针对副作用的,在我看来,你所想的效果解决方案是完全有效的。您正在添加页面,但该部分也应该注意这一点。这肯定是副作用,对吗?因此,效果是一个很好的解决方案。

@效果是针对有副作用的行动。到目前为止,您已经提到了纯操作(这些操作没有副作用),所以这些操作应该由还原程序处理

您应该有两个操作,每个减速器一个:

ADD_SECTION_PAGE
ADD_PAGE
newId = Object.keys(pagesState).length > 0 
  ? Object.keys(pagesState).sort().reverse()[0] + 1 : 1;
如果要添加页面并将其添加到节中,请从存储区发送两条消息:

onAddPage() {
    this.store.dispatch(new AddSectionPageAction({sectionId:1, page:4 }));
    this.store.dispatch(new AddPageAction({ id:4, title: 'Some Page Title' }));
}
SectionReducer将根据sectionId查找节,并将新页添加到pages数组中

PageReducer会将页面添加到PageState

ID的计算可以在减速器中进行:

ADD_SECTION_PAGE
ADD_PAGE
newId = Object.keys(pagesState).length > 0 
  ? Object.keys(pagesState).sort().reverse()[0] + 1 : 1;

或者,如果通过web API调用添加页面,请通过@effect添加页面,并将id传递给add_page操作。

@effect用于具有副作用的操作。到目前为止,您已经提到了纯操作(这些操作没有副作用),所以这些操作应该由还原程序处理

您应该有两个操作,每个减速器一个:

ADD_SECTION_PAGE
ADD_PAGE
newId = Object.keys(pagesState).length > 0 
  ? Object.keys(pagesState).sort().reverse()[0] + 1 : 1;
如果要添加页面并将其添加到节中,请从存储区发送两条消息:

onAddPage() {
    this.store.dispatch(new AddSectionPageAction({sectionId:1, page:4 }));
    this.store.dispatch(new AddPageAction({ id:4, title: 'Some Page Title' }));
}
SectionReducer将根据sectionId查找节,并将新页添加到pages数组中

PageReducer会将页面添加到PageState

ID的计算可以在减速器中进行:

ADD_SECTION_PAGE
ADD_PAGE
newId = Object.keys(pagesState).length > 0 
  ? Object.keys(pagesState).sort().reverse()[0] + 1 : 1;
或者,如果您通过web API调用添加页面,请通过@effect添加页面,并将id传递给添加页面操作。

基于

您可以访问Effect类中的状态。请参阅下面的相关代码。选择器是一种生成状态切片的方法,您必须在reducer中调度状态和相关数据,以更新状态

```

@Effect()specialEffect$=this.actions$
.类型(添加_行)
.最晚从([
this.store$.select(state=>state.lines),
this.store$.select(state=>state.pages])
.map([action:action,linesOrPages:Lines | Pages])=>{
//做点什么。。。
});
基于

您可以访问Effect类中的状态。请参阅下面的相关代码。选择器是制作状态切片的一种方法,您必须在reducer中使用相关数据分派状态以更新状态

```

@Effect()specialEffect$=this.actions$
.类型(添加_行)
.最晚从([
this.store$.select(state=>state.lines),
this.store$.select(state=>state.pages])
.map([action:action,linesOrPages:Lines | Pages])=>{
//做点什么。。。

})
我不确定我是否理解你的建议。我要做的是添加一个新页面,同时将其添加到一个节页面数组中,而不是添加一个新节。由于在“添加页面”操作被分派时,该页面没有ID,节缩减器无法将I添加到一个节页面数组中。这意味着我必须首先添加不要添加页面,等待它完成,使其具有ID,然后将其添加到sections数组。当我现在写这篇文章时,听起来像是一个副作用。我明白了,我现在明白了。我仍然不认为这是一个副作用。好了,现在看到了您编辑的响应,使用这种方法,我需要知道发送活动的组件中已经存在的新页面的ID在上。这感觉像是业务逻辑,不应该在reducer中吗?对于这个实现,我认为我使用这种方法是安全的,因为我使用的是GUID,但是如果我将一个数字作为id,它将需要是唯一的,并且查找唯一id的逻辑不应该在发送操作的组件中?你是对的。我将为I传递0d,并让你的reducer计算唯一的IDB,然后我们回到我原来的问题…节reducer必须在新页面上有和ID,才能将其添加到节页面数组中。这意味着add_页面操作必须首先完成,以便页面具有ID,然后将其添加到节不确定我是否理解接受你的建议。我想做的是添加一个新页面,同时将其添加到一个节页面数组中,而不是添加一个新的节。Si