2012-02-08 4 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] '? –

+0

Можете ли вы включить объект "g"? –

+0

@JulianD .-- g просто содержит пустой 'comPos'. 'g = {comPos:" "}' – dopatraman

ответ

0

Когда вы

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

это действительно ярлык для поиска g.comPos[g.thisRowID], получая объект, который приводит, а затем вставить новое значение атрибута. Другими словами, это эквивалент

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

Я предполагаю, что если вы сломали ваш код, как это, то, что промежуточный «myTemporaryObject» будет нулевым.

Должен быть заполнен этот промежуточный объект явно; он не просто появляется там по волшебству.

Try что-то вроде

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 »undefined» – dopatraman

+0

@JacobM - пустой объект работал, но недостатком является то, что я каждый раз очищаю объект строки каждый раз, когда я перетаскиваю что-то. – dopatraman

+0

Не уверен, что вы имеете в виду, чтобы очистить объект строки чистым - идея использования синтаксиса OR ('g.comPos [g .thisRowID] || {} ') заключается в том, что если объект строки уже определен, он остается, но если он не определен, мы определяем его с пустым. Вы можете сделать то же самое для определения объектов g и comPos: 'g = g || {}; g.comPos = g.comPos || {} ' –

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