Создание локальной ссылки на ключ jQuery.data - PullRequest
3 голосов
/ 23 апреля 2011

Я провожу некоторое тестирование на jQuery.data() и пытаюсь создать локальную ссылку на определенный ключ данных, который, я надеюсь, может измениться локально и все равно повлиять на "снаружи".Я думаю, что было бы лучше с примером, из-за полудлинного кода, который я разместил на jsFiddle, а не здесь:

http://jsfiddle.net/esbenp/p4kt2/22/

результат, на который я надеюсь:

{1: {length: 1}, total: 1}

но приращение локальной переменной влияет только на свойство длины:

{1: {length: 1}, total: 0}

что мне делать?

Ответы [ 2 ]

5 голосов
/ 23 апреля 2011

Если вы храните объект (или массив) в .data(), тогда вы на самом деле сохраняете ссылку на него, так что если вы делаете:

var obj = { key: 'value' }
$(el).data('obj') = obj;
obj.key = 'new value';

$(el).data('obj').key также будет new value, потому что это тот же объект .

Однако если вместо сохраненного значения (например, числа или строки) будет храниться копия этого значения:

var n = 5;
$(el).data('obj') = n;
n++;

$(el).data('obj') все равно будет 5.

2 голосов
/ 23 апреля 2011

Я не собираюсь лгать - этот код невероятно запутан. Есть ли причина, по которой вам нужно использовать все эти функции? Кажется (по крайней мере, для этого непрофессионала), что вы могли бы написать это гораздо более простым способом для достижения своей цели.

В любом случае, я не уверен, что это ответ, который вы ищете, но я просто остановил отладчик внутри AddError, чтобы я мог понять его область действия и то, что было доступно. Поэтому все, что вам нужно сделать, чтобы он вернул желаемый результат, это:

http://jsfiddle.net/qN7wF/2/

functions = {
    AddError: function() {
        console.log(total);
        $(container).data('errors').total++;
        errors.length++;
  },

Но, учитывая контекст ... Я предполагаю, что в игре должно быть что-то еще.

...