2017-06-12 163 views
1

我几乎是一个redux模式的新手,并刚刚开始使用ngrx。这真棒,这是我想尽可能使用的东西,但我有几个关于Store概念的问题。商店vs商店<T>

我会尝试通过几个示例来描述问题,并在本帖末尾提问我的问题。

让我们先从AppState接口和减速器:

export interface AppState{ 
    people: Person[], 
    events: Event[] 
} 

//events reducer 
export function eventsReducer(state: any = {}, {type, payload}): Event[]{ 
    switch(type){ 
    case "ADD_EVENT": 
     return [...state, payload]; 
    default: 
     return state; 
    } 
} 

//people reducer 
export function peopleReducer(state: any = {}, {type, payload}): Person[]{ 
    switch(type){ 
    case "ADD_PERSON": 
     return [...state, payload]; 
    default: 
     return state; 
    } 
} 

//root reducer 
const root: ActionReducer<AppState> = combineReducers({people: peopleReducer, events: eventsReducer}); 
const INITIAL_STATE = { 
    people:[], 
    events: [] 
} 
export function rootReducer(state: any = INITIAL_STATE, action: any){ 
    return root(state, action); 
} 

rootReducer加入这样的:

//part of the AppModule 
... 
imports:[ 
..., 
StoreModule.provideStore(rootReducer) 
] 

,并在主AppComponent这里是如何我accesing的store

//part of the AppComponent 
export class AppComponent{ 
    people: Observable<Person[]>; 
    events: Observable<Event[]>; 

    constructor(private store: Store<AppState>){ 
     this.people = store.select('people'); 
     this.events = store.select('events'); 
    } 
} 

现在,一切我很喜欢这个概念,但我注意到,如果我从AppState界面删除其中一个属性(例如,我删除了people属性,其他所有内容保持不变),则没有任何更改(或中断)。

所以我想知道有Store<AppState>,而不是仅仅Store主要的原因是什么,什么是使用Store<AppState>(它实际上取得对抗只是用Store差异)的主要优势是什么?另外,是否有一种方法可以在AppState更改时至少执行运行时错误,但其他所有内容都保持不变?

我使用错误的可能性也非常高,但我仍然想知道这些问题的答案。

回答

1

商店的select method可以传递一个或多个属性字符串或选择器函数。

当传递属性字符串时,它的行为如同pluck。当通过选择器功能时,它的行为如同map

这些之间的显着差异是传递给pluck的属性路径无法进行类型检查,并且pluck返回Observable<any>,因此状态的类型信息基本上丢失。

如果使用选择功能,相反,你会看到打字稿错误,遗漏属性等

例如,这样的:

store.select(state => state.missing); 

会影响一个错误,而这不会:

store.select('missing'); 
+0

感谢您的回答。我一直在研究'Store '实现中''T'的功能,但从来没有打算检查'select'方法。 – eminlala