2017-02-28 77 views
-4
import { Blog } from './app.model'; 
import { ActionReducer, Action } from '@ngrx/store'; 
import * as _ from 'underscore'; 

export const LOAD_BLOGS = 'LOAD_BLOGS'; 
export const SAVE_COMMENT = 'SAVE_COMMENT'; 

export interface AppState { 
    blogs : Blog[] 
} 

export const initialState : AppState = { 
    blogs : [] 
}; 

var a; 

export const reducer = (state : AppState = initialState, action :Action) => { 
    switch (action.type) { 
     case LOAD_BLOGS: 
      return Object.assign({}, state, { 
       blogs : action.payload 
      }); 

     case SAVE_COMMENT: 
      const {title, comment} = action.payload; 
      return state.blogs.map(states =>{ 
        if(states.title === action.payload.title){ 
        console.log(states); 
        return Object.assign({}, states ,{ comment : [...states.comment , action.payload.comment]}); 
       } 
       return Object.assign({}, states); 
      }); 

     default: 
      return state; 
    } 
} 

商店之前SAVE_COMMENT ACTIONObject.assign()具複雜對象Angular2 NGRX /存儲

{blogs : [{id: 1, "title" : "one", "comment" : ["oneC", "twoC"]}, {id: 2, "title" : "two", "comment" : ["oneC", "TwoC"]}]} 

STORE後COMMENT 「ThreeC」 SAVE_COMMENT ACTION與標題 「二」

博客
[{id: 1, "title" : "one", "comment" : ["oneC", "twoC"]},{id: 2, "title" : "two", "comment" : ["oneC", "TwoC", "ThreeC"]}] 

outter blogs應該包含對象數組的對象不存在,而只是一個數組o f對象與更新的博客。

+0

如果你知道'Object.assign()'那麼你嘗試過什麼? – Jai

+10

如果緊急,請儘可能清楚地說明問題,而不是添加緊急文本。 –

+0

我已經更新了這個問題,請看看.. –

回答

0

我會建議你把一些簡單的console.logs在減速功能和for循環中的細節功能,看它在做什麼。

你的問題是,你有你的減速功能的映射,遍歷每一個博客,然後在你的細節再次工作,你環路上的所有博客,一旦你找到匹配返回匹配。

這意味着你在每一個博客帖子循環,並與相匹配的博客標題(你會打return Object.assign({},state,c);)的更換。

您可以通過多種方式解決,但如果你喜歡你的代碼結構,你可以只通過該博客的狀態轉變的細節和去除的循環。