2012-02-08 24 views
0

我試圖記錄屬於一行的對象的位置。所以最後我需要一個全面的對象,它包含行和行內「com」的位置。這是我的代碼:(g是一個全局對象)試圖使用括號表示法訪問深度值

g = {comPos:""} 

$(".Com").draggable({ 
      start: function(event, ui) { 
       var thisRow = $(this).closest("div[id^='step']"); 
       g.thisRowID = thisRow.attr("id"); 
       g.thisComID = $(this).attr("id"); 
       console.log(g.thisComID); //returns the id value 
      }, 
      stop: function(event, ui) { 
       var thisX = event.pageX; 
       var thisY = event.pageY; 
       var thisComPos = { 
        id: g.thisRowID, 
        x: thisX, 
        y: thisY 
       } 
       g.comPos[g.thisRowID][g.thisComID] = thisComPos; //undefined 
      } 
     }); 

這是一個被拋出的錯誤:

"TypeError: Cannot set property 'com1' of undefined" 

使用括號標記我有不確定的回報方式。我究竟做錯了什麼?請告訴我,如果你需要更多的代碼,我已經粘貼了我認爲相關的部分。

+0

我想我們需要看到g'的'定義。什麼是返回undefined,它是'g.comPos [g.thisRowID] [g.thisComID]'? – 2012-02-08 20:25:26

+0

你可以包含「g」對象嗎? – 2012-02-08 20:27:22

+0

@JulianD .-- g只包含一個空的「comPos」。 'g = {comPos:「」}' – dopatraman 2012-02-08 20:29:02

回答

0

當你

g.comPos[g.thisRowID][g.thisComID] = thisComPos; 

它是真正用於查找g.comPos[g.thisRowID],漸漸導致的對象,然後插入一個新的屬性值的快捷方式。換句話說,它是

var myTemporaryObject = g.comPos[g.thisRowID]; 
myTemporaryObject[g.thisComID] = thisComPos; 

相當於我猜,如果你打破了你這樣的代碼,那麼這中間的「myTemporaryObject」將是零。

使中間對象被填充必須明確地發生;它不會僅僅通過魔法出現在那裏。

嘗試像

g.comPos[g.thisRowID] = g.comPos[g.thisRowID] || {} //create an empty intermediate object if necessary 
g.comPos[g.thisRowID][g.thisComID] = thisComPos; 
+0

@ JacobM - 我嘗試了您的解決方案,並清理了相同的錯誤:「TypeError:無法設置未定義的屬性」com1「 – dopatraman 2012-02-08 20:31:18

+0

@JacobM - 空的對象工作,但缺點是,我每次拖動東西時清理行對象 – dopatraman 2012-02-08 20:35:04

+0

不清楚你的意思是關於清理行對象 - 使用OR語法的想法('g.comPos [g .thisRowID] || {}')是,如果行對象已經定義,它仍然存在,但是如果它沒有定義,我們定義它爲空。您可能想要定義g和comPos對象:'g = g || {}; g.comPos = g.comPos || {}' – 2012-02-08 20:46:31