Как показать детали из ArrowDB для отдельных объектов #appcelerator

Я запросил у ArrowDB и получил список событий, теперь мне нужны сведения о каждом отдельном событии при нажатии на конкретное представление. Мой код, как показано ниже, работает, за исключением того, что он помещает сведения обо всех запрошенных событиях в открытое окно и показывает последнее запрошенное событие вверху.

Как я могу это сделать, пожалуйста? Мой мозг просто не может исправить это.

 Cloud.Events.query(function (e) {
        if (e.success) {
            alert('Success:\n' + 'Count: ' + e.events.length);

            for (var i = 0; i < e.events.length; i++) {
                var event = e.events[i];
                alert('id: ' + event.id + '\n' +
                      'name: ' + event.name + '\n' +
                      'start time: ' + event.start_time);
                var holdview = Ti.UI.createView({
                     backgroundColor: '#d3d3d3',
                     backgroundImage: 'testview.png',
                     width: '85%',
                     height: '85%',
                     top: '5%'
                });

                //adding holdview to a scrollable view

               xperiencesscrollableview.addView(holdview);

               var testlabeltitle = Ti.UI.createLabel({
                    top: '5%',
                    width: '65%',
                    height: '10%',
                    left: '20%',
                    text: event.name
               }); 
               //it works well to this point and shows each event separately on views
               holdview.add(testlabeltitle);
       //adding forEach as suggested as an answer            
               e.events.forEach(function(event) {
        holdview.addEventListener('click',function(e){

            var detailstestname = Ti.UI.createLabel({
        top: '5%',
        width: '65%',
        height: '10%',
        left: '20%',
        text: event.name,
        color: 'black',
        backgroundColor: 'white'
        }); 
       //Page for event details
        eventdetailspage.open();
        eventdetailspage.add(detailstestname);
        });
 });    
               //at this point it messes up
            }
         }
     });

person Olli    schedule 26.01.2016    source источник


Ответы (1)


Проблема заключается в том, что вы используете цикл for, блок кода которого не имеет собственной области видимости. event.name, который вы используете для метки detailstestname, всегда будет событием последнего цикла к моменту завершения цикла и обработки события click.

Вы можете использовать закрытие:

for (var i = 0; i < e.events.length; i++) {
  (function(event) {
    ..
  })(e.events[i]);
}

Или используйте .forEach():

e.events.forEach(function(event) {
  ..
});
person Fokke Zandbergen    schedule 27.01.2016
comment
Закрытие при использовании блокирует отображение других событий в прокручиваемом представлении. forEach работает нормально, но затем добавляет весь текст на открытую страницу с последним значением поверх всех - person Olli; 27.01.2016
comment
Я добавлю код к вышеуказанному вопросу, чтобы вы видели, что я сделал. - person Olli; 27.01.2016
comment
Вы не реализовали мое предложение, как я хотел. forEach() должен заменить цикл for, а не быть вложенным в него. - person Fokke Zandbergen; 28.01.2016
comment
После того, как вы сделали то, что вы предложили, и это сработало, я добавил .removeAllChildren() в представление, чтобы сделать май. Спасибо. - person Olli; 28.01.2016