2017-07-31 168 views
1

我正在從Angular 2升級到Angular 4 + Universal。在以前的版本中,我在reducer中使用存儲狀態來設置初始狀態。 getInitialState函數將設置狀態,然後檢查緩存是否有以前的值並更新狀態。狀態然後在導出的默認功能user中返回。如何在Angular Universal應用程序中設置初始狀態?

function getInitialState() { 
let initialState; 
const emptyState = { 
    categories: null, 
    seeAllUsers: null, 
    groups: userGroupExists(), 
    formData: null, 
    bonusSeeAllUsers: null, 
    fetching: false, 
    searchResults: null 
}; 
if (isBrowser) { // here is my problem 
    if (window['UNIVERSAL_CACHE'] !== undefined) { 
     const cache = JSON.parse(window['UNIVERSAL_CACHE'].CacheService); 
     if (cache) { 
      initialState = { 
       groups: cache.groups ? updateGroups(cache.groups) : null, 
       seeAllUsers: cache.seeAllUsers ? updateSeeAllUsers(cache.seeAllUsers) : null, 
       groups: userGroupExists(), 
       formData: null, 
       bonusSeeAllUsers: null, 
       fetching: false, 
       searchResults: null 
      }; 
     } else { 
      initialState = emptyState; 
     } 
    } else { 
     initialState = emptyState; 
    } 
} else { 
    initialState = emptyState; 
} 
return initialState; 
} 

export default function user(state: any = initialState, action: Action{ 
     switch (action.type) { 
     case TYPES.RECEIVE_USERS_SEE_ALL_BEGIN: 
      let nextSeeAllBeginState; 
      if (action.payload.data === 0) { 
      return assign({}, state, { 
      seeAllUsers: {}, 
      bonusSeeAllUsers: {}, 
      fetching: true 
      }); 
      } 
     }  
    } 

由於最近更新角環球,其對PLATFORM_ID注入構造函數來檢查代碼在瀏覽器或服務器這樣的運行要求:

constructor(@Inject(PLATFORM_ID)platformId: string){ 
    isPlatformBrowser(platformId){ 
     // access window 
    }; 
} 

由於減速器不能使用任何角裝飾器,如何利用緩存中的值來更新我的狀態?

回答

0

您是否嘗試過/抓住窗口?例如:

try { 
    const cache = window.UNIVERSAL_CACHE; 
} catch (e) {} 

這就是我在導入platformId之前如何管理瀏覽器特定的代碼以實現通用兼容。

+0

感謝您的支持。有必要使用'try'和'catch'來查看緩存是否可用。我會嘗試一下,讓它知道它是否有效。 –

相關問題