2016-06-12 2 views
0

Я чувствую, что метод .each() на самом деле не работает. Вот мой код:jQuery .each метод, возвращающий последнее значение

function makeHTML(data) { 
console.info(data.categories); 

$(data).each(function() { 
    let createButton = ` 
       <div class="col-md-6"> 
        <button type="button" class="btn btn-default"> 
         <a href="${data.categories.category.id}" 
         target="_blank">${data.categories.category.title}</a> 
        </button> 
       </div> 
       `; 
    document.getElementById('table').innerHTML = createButton; 
}); 
} 

$(document).ready(function() { 
$.ajax({ 
    type: 'GET', 
    contentType: "application/json; charset=utf-8", 
    url: "json/data.json", 
    dataType: "json", 
    success: makeHTML, 
    error: function (result) { 
     console.error(result); 
    } 
}); 
}); 

Это возвращает только последний набор в формате JSON, который выглядит следующим образом:

{ 
    "categories": { 
    "category": { 
     "title": "Something", 
     "id": 1 
    }, 
    "category": { 
     "title": "Something Else", 
     "id": 2 
    } 
    } 
} 

Я попытался добавить отладчик; сразу после innerHTML = createButton; для просмотра цикла, но он входит в jQuery только один раз. Это странно. Я не знаю, что я делаю неправильно?

+0

Какова цель каждого из них? Я не вижу, чтобы вы использовали какие-либо параметры внутри обратного вызова ... Разве 'data.categories' не будет всегда одинаковым? – elclanrs

+2

'categories' - это объект, который имеет свойство' category' _twice_. – robertklep

+0

Как и было предложено, вы, вероятно, хотите, чтобы 'categories' были массивом. – robertklep

ответ

0

Если вы измените его на:

{ 
    "categories": { 
    "category1": { 
     "title": "Something", 
     "id": 1 
    }, 
    "category2": { 
     "title": "Something Else", 
     "id": 2 
    } 
    } 
} 

Ваш код будет распознавать как объекты, так что вы не можете складывать их так. JSON перезаписывает свои атрибуты и видит только одну версию. Вам необходимо изменить его на массив .

Вход с поджигатель:

Объект {category1 = {...}, category2 = {...}}

Вы должны изменить функцию:

function makeHTML(data) { 
console.info(data.categories); 

$(data.categories).each(function (index, data2) { 
    var createButton = ` 
       <div class="col-md-6"> 
        <button type="button" class="btn btn-default"> 
         <a href="${data2.id}" 
         target="_blank">${data2.title}</a> 
        </button> 
       </div> 
       `; 
    document.getElementById('table').innerHTML += createButton;//add not set 
}); 
} 

$(document).ready(function() { 
$.ajax({ 
    type: 'GET', 
    contentType: "application/json; charset=utf-8", 
    url: "json/data.json", 
    dataType: "json", 
    success: makeHTML, 
    error: function (result) { 
     console.error(result); 
    } 
}); 
}); 

И данные к

{ 
    "categories": [ 
    { 
     "title": "Something", 
     "id": 1 
    }, 
    { 
     "title": "Something Else", 
     "id": 2 
    } 
    ] 
} 
+0

Да, добавление чисел плохо, это был просто пример того, как это работает, и что происходит. – Rjiuk

+1

, если вы измените свой ответ на то, что данные должны выглядеть как массив, я выберу это как ответ. –

0

Я думаю, вы должны изменить строку на что-то вроде этого:.

$(data.categories).each(function (key, value) { 
    console.log("title", value.title); 
}); 
0

вы положили document.getElementById ('стол') innerHTML = CreateButton; в каждом цикле, таким образом, вы пишете n раз в таблице, и каждый раз, когда вы ставите только последний «createButton» , я предлагаю вам инициализировать вашу переменную до вашего цикла each(), а затем конкатрировать каждый ответ с каждой итерации и только в конце вставьте ваши данные в innerHTML.

1

Проблема в том, что вы используете неправильный формат JSON. Вы дублируете ключи, и имена должны быть уникальными. Это должно работать

{ 
     "categories":[ 
      { 
      "title":"Something", 
      "id":1 
      }, 
      { 
      "title":"Something Else", 
      "id":2 
      } 
     ] 
    } 

Другое дело, что вы пытаетесь добавить элементы div на таблицу, таблица должна содержать строки и столбцы. Так что, если я понимаю ваш вопрос, это путь ваш, как добавить ваши JSON элементов в таблице: HTML:

<table id='table'> 

</table> 

переменные сценария: код

var categoriesJson = [ 
      { 
      "title":"Something", 
      "id":0 
      }, 
      { 
      "title":"Something Else", 
      "id":1 
      } 
     ] 
var result = ''; 

сценарий:

$(document).ready(function(){ 

      $.each(categoriesJson, function (i, item) { 
        result += "<tr><td><button id='"+item.id+"'>" + item.title + "</button></tr></td>" 

       $('#table').append(result); 
      }); 


     }); 
+0

ツ это дает мне данные обратно в консоль. Теперь мне нужно, чтобы createButton работал, но я уверен, что все пойму. Я вижу, как это работает сейчас. Спасибо. Ты восхитителен! –

+0

Я обновлю этот код, это была первая ошибка, которую я видел :) – Merian

+0

оцените усилие. Я сделал это по-другому. Моя $ (data.category) .each (функция (i) была действительно такой. Чем я мог сделать console.log (data.category [i] .title), например, я не мог бы сделать это без вас хотя вы должны проверить https://developers.google.com/web/updates/2015/01/ES6-Template-Strings?hl=ru –

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