2016-08-02 65 views
3

我發現了一個「無效的keyPath」錯誤嘗試更新我的結構:不變JS更新深層結構

state = fromJS({ 
    cmsData: { 
    "pages": [ 
     { 
     "name": "page1", 
     "content": { 
      "header": "Example header", 
      "intro": "Example intro", 
      "body": "Example body", 
     } 
     } 
     ... 
} 

我試圖更新的頁面數組中的值,使用此:

state.setIn(['cmsData', 'pages', index, 'content', title], value) 

索引是一個數字,標題字符串和值也是一個字符串。然而,一旦

state.setIn(['pages', index, 'content', title], value) 

我嘗試訪問的主要「cmsData」對象,然後我得到一個錯誤:

我可以代替做創建一個新的項目。

------ UPDATE ------

我最初設定cmsData對象,而不是它是初始狀態

state.set('cmsData', data) 

如果我有對象作爲初始狀態,它工作正常。然而嘗試它被設置後更新產生無效的keyPath

----- -----解決方案

而不是設置初始數據的,我用mergeDeep它的工作!

state.mergeDeep({ 'cmsData': data }) 

回答

0

您能再請重新檢查嗎?我試過你的代碼,它似乎工作正常。

var state = Immutable.fromJS({ 
    cmsData: { 
    "pages": [ 
     { 
     "name": "page1", 
     "content": { 
      "header": "Example header", 
      "intro": "Example intro", 
      "body": "Example body", 
     } 
    } 
    ] 
}}); 

我剛執行了這個語句,它返回了一個預期的對象。

這裏是link to jsbin

+0

查看更新瞭解更多信息!我實際上在設置cmsData對象之前嘗試更新它,而不是該對象是初始狀態。道歉不清楚! – Boyswan

0

你的新項目創建SETIN似乎對的Elid水平cmsData。不知道爲什麼這會影響其他訪問,但也許你沒有創建你認爲你有的東西,所以當該項目不存在於該鍵路徑時(即,在cmsData中),這是錯誤的

0

而不是設置初始數據,我用mergeDeep哪個工作過!

state.mergeDeep({ 'cmsData': data })