JSON глобально модифицируется в моем JavaScript ... почему? - PullRequest
0 голосов
/ 02 декабря 2010

Ниже приведены некоторые функции, которые у меня есть, которые используют официальный плагин jQuery Template и вставляют несколько JSON, которые мои бэкенд-разработчики дают мне в var s topPages и latestPages, но по некоторым причинам, когда я вызываю insertOrHideList() функцию, а затем вызвать нормальную функцию renderList(), которая по какой-то причине переносит атрибут max. Таким образом, вместо получения 100 результатов (см. 2-ю строку renderList(), я получаю 5, см. insertOrHideList() вызовы внизу)

Есть идеи?

       function renderList(json,max){
            if(!max){max=100}
            tempjson = json;
            tempjson.length = max;
            the_template = $.template(null, '<li><a href="{{if CONTENT_ID}}article/${CONTENT_ID}{{else}}${CATEGORY_TREE_ID}{{/if}}" title="Go to the ${TITLE} page">${TITLE}</a></li>');
            return $.tmpl(the_template,tempjson);
        }

        function insertOrHideList(selector,json,max){
            if(!max){max=5}
            if(typeof json !== 'undefined' && json.length >= 5){
                $(selector).append(renderList(json,max));
            }
            else{
                $(selector).parent().remove();
            }
        }
        insertOrHideList('.most-popular ol',topPages,5);
        insertOrHideList('.recently-added ol',latestPages,5);

        console.log(renderList(latestPages));

Ответы [ 3 ]

3 голосов
/ 02 декабря 2010

Когда вы делаете это:

tempjson = json;

Этот глобальный массив tempjson имеет ту же ссылку, что и ваш json (latestPages), поэтому изменения, которые вы вносите в него,сделано в оригинале.Чтобы получить новый массив для работы, вам нужно сделать копию, например:

var tempjson = json.slice(0);

Обратите внимание на добавление var, так что мы также не создаем глобальную переменную (отдельная проблемаздесь).

1 голос
/ 02 декабря 2010

Похоже, что вы проходите макс через эту строку:

$(selector).append(renderList(json,max));

, что будет 5, от вызовов insertOrHideList. Вы на самом деле после:

$(selector).append(renderList(json,json.length));

0 голосов
/ 02 декабря 2010
if(typeof json !== 'undefined' && json.length >= 5){
  $(selector).append(renderList(json,max));
}

должно быть:

if(typeof json !== 'undefined' && json.length >= max){
  $(selector).append(renderList(json,json.length));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...