2017-02-18 29 views
0

我正在使用ngrx存储与不可变来处理我的角2应用程序中的数据。我有一个reducer将数据从一个成功的API调用转换成不可变的商店的id到对象的映射:sessions: Map<number, ISession>。要从本地阵列ISession[]转换成action.payload我执行foreach循环,在withMutations拨打:For循环填充不可变映射从零索引零数据点

case SessionsActions.LOAD_SESSIONS_SUCCESS: 
    return state.withMutations(map => { 
    map.set('loading', false); 

    action.payload.forEach((session: ISession) => { 
     console.log("Setting ",session); 
     map.setIn(['sessions', session.id], session); 
    }); 
    }) as ISessions; 

我得到预期的控制台输出,四个项目:

Setting Object {id: 6, payslip: null, invlice: null, paidByClient: false, completed: false…} 
Setting Object {id: 8, payslip: null, invlice: 1, paidByClient: true, completed: false…} 
Setting Object {id: 9, payslip: 1, invlice: 1, paidByClient: true, completed: false…} 
Setting Object {id: 7, payslip: null, invlice: null, paidByClient: false, completed: false…} 

但店内充满与10个项目,它的填充的ID从0用null直到最大(9)其中的数据本身被存储:

enter image description here

任何想法为什么会发生这种行为?

回答

0

我通过手动构造图和使用set而不是setIn设置它解决了这个问题:

case SessionsActions.LOAD_SESSIONS_SUCCESS: 
    var state = state.withMutations(map => { 
    map.set('loading', false); 

    var sessions = Map<String, ISession>(); 
    for (var i = 0; i < action.payload.length; i++) 
    { 
     var session = action.payload[i]; 
     sessions = sessions.set(session.id, session); 
    } 
    map.set('sessions', sessions); 
    }) as ISessions; 

我想这是与withMutations功能一些bug。