2012-06-03 2 views
0

Кто-нибудь ум объяснить мне, почему ...инкапсуляция проблема с созданием массива объектов

$(document).ready(function() { 
    var scu = ['0291285', '0409338', '0521704', '0521990', '0523652', '0523657', '0523660', '0523704']; 
    var inData = $('#output'); 
    var testdiv = $('#testdiv'); 
    function Item(scu, description, price, extended, type) { 
     this.scu = scu; 
     this.description = description; 
     this.price = price; 
     this.extended = extended; 
     this.type = type; 
     //this.saved = function() {}; 
    } 
    var rows = []; 
    function get() { 
     inData.html('');  
     $.each(scu, function(index, val) { 
      $.post('chBuild.php', {scu:val}, function(output) { 
       $.each(output, function(i, obj) { 
        var i = 0; 
        rows[i] = new Item(obj.scu, obj.description, obj.price, obj.extended, obj.type); 
        console.log(rows[i].price) 
            //this logs every object but...     

        i =+ 1; 
       }); 
      }, 'json');   
     }); 
     console.log(rows[0].price); 

      //this says rows[0] is undefined? 

    } 
    inData.click(get); 
}); 

Я пытаюсь найти лучший способ для создания и хранения нескольких объектов.

+1

Вы не должны делать 'var i = 0' внутри' each', таким образом каждый элемент будет назначен на позицию '0'. Последнее утверждение ('i + = 1;') не имеет значения, поскольку эта переменная существует только внутри этого замыкания (т. Е. Каждый цикл итерации будет переопределять 'i'). Используйте аргумент 'i' в качестве аргумента (' function (i, obj) {'), он будет точным в вашем случае. – mgibsonbr

+0

@mgibsonbr на деньги, дополнительные 'var i' всегда будут равны нулю. Также удалите 'i = + 1' – charlietfl

ответ

3
$.post('chBuild.php', {scu:val}, function(output) { 
      $.each(output, function(i, obj) { 
       var i = 0; 
       rows[i] = new Item(obj.scu, obj.description, obj.price, obj.extended, obj.type); 
       console.log(rows[i].price) 
       i =+ 1; 
      }); 
     }, 'json');   

Здесь вызов $ .post асинхронный, будет заполняться только при возвращении Ajax вызовов. Возможно, вы должны сделать это синхронно

$.ajax({'url': 'chBuild.php', 'async': false, ...); 
3

Это потому, что $.post является асинхронным. each запускает HTTP-запрос, но он возвращается немедленно, поэтому, когда второй console.log запускает этот элемент, он еще не был создан.

+0

Есть ли способ заставить его работать только после' $ .post'? – user1114060

+0

Вы имеете в виду, после того, как все сообщения для всех itens запущены? Вы могли бы сделать запросы синхронными, как предложил JoseP. Могут быть и другие способы, но я не могу ответить на это с самого начала. – mgibsonbr

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