Rest 与Angular2 ngrx类似的Twitter应用程序。结构化应用状态

Rest 与Angular2 ngrx类似的Twitter应用程序。结构化应用状态,rest,angular,routing,redux,ngrx,Rest,Angular,Routing,Redux,Ngrx,我最近一直在研究ngrx和redux模式,我在想如何将现有的Angular2应用程序重写为使用ngrx/store。 我拥有的是一个应用程序,用户可以在其中查看(如果已登录)并喜欢和发布引用。 典型的引用对象如下所示: { 课文:“成功是在不丧失热情的情况下从一次失败走向另一次失败的能力。”, 发布者:user12345, 职级:14, //更多数据 } 应用程序结构如下所示: 主页-带有注册/登录表单或随机引用(如果已登录) 带有选项卡的配置文件页面 选项卡,其中包含用户发布的所有引用以及

我最近一直在研究ngrx和redux模式,我在想如何将现有的Angular2应用程序重写为使用ngrx/store。 我拥有的是一个应用程序,用户可以在其中查看(如果已登录)并喜欢和发布引用。 典型的引用对象如下所示:

{
课文:“成功是在不丧失热情的情况下从一次失败走向另一次失败的能力。”,
发布者:user12345,
职级:14,
//更多数据
}

应用程序结构如下所示:

  • 主页-带有注册/登录表单或随机引用(如果已登录)
  • 带有选项卡的配置文件页面
    • 选项卡,其中包含用户发布的所有引用以及发布新引用的表单
    • 配置文件信息
  • 引文提要页
  • 页面以查看与上述结构类似的其他用户的配置文件。(当用户单击引文发布者时)
因此,我对AppState树的外观感到非常失望

AppState {
    UserState {
        UserCitationsState, 
        UserInfoState, 
        AuthState
    },
    RouterState,
    UserPageState //State representing the other user's page viewed
    //etc
}
主要的问题是-由于所有数据都是从后端REST api的每个请求中获取的,所以我应该在每个状态中存储什么。是否只是布尔值,例如:

UserPageState {
    loading: false,
    loaded: true
}
或者它也应该存储所有信息,并在每次请求新用户页面时替换它?当用户每次导航到其他用户页面时,所有数据都从后端获取。 这就是我最困惑的地方——如何用redux处理这类应用

编辑 目前,我用5个状态(5个减缩器)来表示整个应用程序:

  • AuthState
  • 用户状态
  • 用户列表状态
  • 引文状态
  • 引文列表状态
  • 然而,在整个应用程序状态中,我复制了很多。我想没关系。还是会有更好的办法

    导出接口AppState
    {
    localUser:AuthState
    //主页
    家庭引文:引文州
    //档案页
    profileInfo:UserState
    简介引文:引文列表状态
    收藏夹引文:引文列表状态
    订阅者:UserListState
    //userPage(当本地用户导航到引文发布者的配置文件时)
    userInfo:UserState
    用户引用:引文列表状态
    userSubscribers:UserListState
    //提要页
    提要:引用列表状态
    //.....
    
    }
    我对此的最初想法是,考虑应用程序状态,就像考虑数据库一样

    我将使用以下减速器进行结构调整:

    AppState: {
       CitationState
       UserProfileState,
       UserInfo,
       RouterState
    }
    
    interface CitationState {
     citations: Citation[]
    }
    
    interface UserProfileState { 
     userProfiles: UserProfile[]
    }
    
    interface UserInfo { 
     userInfo: UserInfo
    }
    
    interface Citation {
      id: number;
      publisherId (userId): number;
      rank: number;
      text: string;
    }
    
    interface UserProfile {
      userId: number;
      citationIds: number[]
    }
    
    interface UserInfo {
       userId: number;
       authToken: string;
    }
    
    然后,每个智能组件将根据渲染视图的需要合成数据。例如,您可以通过检查路由的用户配置文件是否与UserInfo reducer中的配置文件匹配来确定用户配置文件是否是您自己的

    不要担心在状态中创建加载/加载,这是您可以从存储的状态派生出来的。由于所有数据都是可观察的,因此当您从中查询时,您将获得可用数据的最新快照

    加载用户引用时,不要绑定到存储的加载属性,而是为该数据构建查询

    例如:

    let userCitation$ = state.select(appState => appState.citations)
         .map(citations => {
               let userCitation = citations.find(c => c.id === userId);
               return {
                  loaded: !!userCitation,
                  userCitation: userCitation
               };
         });
    

    你能看看我做的编辑吗。你觉得这种结构怎么样?因为目前我只能想象我的应用程序状态为每页。这取决于每个状态的内容。例如,homeCitation(主页)中包含哪些数据?在我看来,你应该试着概括一下数据。不要认为这个页面需要这些数据并将其放在页面缩减器中,而是应该考虑如何将这些数据放在其他页面可以使用的地方。除非你有一个特定的属性要保存,否则我不会对页面进行缩减。我看到引用列表状态有多种用途。请记住,如果您在应用程序中的任何位置都有重复的数据,那么您可能是做错了。例如,引用是否可以同时存储在Favorite引文和提要中?如果答案是肯定的,那么您需要创建一个名为引文的缩减器,并将所有引文都收集在那里。@PeterSmith,您完全正确。我的意思是,我只有一个缩略词——引文。但是,AppState包含多个子状态,这些状态使用引文缩减器。我在这里的一个单独问题中更详细地描述了我的问题:。如果你能看一看,我将非常感激。