2016-06-26 3 views
1

В моем приложении я имею много часть государства, которая свидетельствующий только тогда, когда пользователь вошел в системуРеагировать Redux -. Условный селектор

Когда пользователь вошел в систему и перейти непосредственно на страницу, маршрутизатор отобразить страницу но нужно сделать асинхронный вызов, поэтому часть состояния еще не заселена.

Теперь предположим, что я должен показать кнопку на панели навигации, которая должна принять часть состояния, но это состояние не заселено с момента вызова асинхронного вызова.

Более Pratically, у меня есть этот селектор:

export const getSelectedCustomer = state => state.systems.selectedCustomer; 

с этим, нет никаких проблем, потому что selectedCustomer является частью initialState редуктора

Проблема заключается в этом селекторе:

export const getSelectedCustomerName = state => { 
    return state.systems.entities[getSelectedCustomer(state)].customer; 
} 

Часть государства entities в initialState является пустым массивом и будет заполняться d при асинхронном вызове.

Таким образом, при запуске приложения и я карта (с подключением - mapStateToProps) селектор getSelectedCustomerName я получаю сообщение об ошибке, потому что entities пуст и уверен, customer поля пока не существует

простого решения, если принять в введите if-else, но мне нужно будет сделать это в «каждой» части приложения.

Я прошу, если есть лучшее решение, чтобы избежать этого ...

ответ

2
const NullCustomerEntities = { 
    customer: "Anonymous" 
} 

export const getSelectedCustomer = state => state.systems.selectedCustomer; 

export const getCustomerEntities = state => { 
    return state.systems.entities[getSelectedCustomer(state)] || NullCustomerEntities; 
} 

export const getSelectedCustomerName = state => { 
    return getCustomerEntities(state).customer; 
} 

Это классический пример Null Object pattern (надеюсь, вы не возражаете код, находясь в Ruby).

+1

Наткнулся на это. Наслаждался сопоставлением JavaScript/Ruby. – larz

Смежные вопросы