Использование цикла для нескольких целей в Wikitude

В настоящее время у меня есть 20 целей, и все они имеют разные URL-адреса. Следуя образцу, все они должны быть объявлены один за другим, например:

// Create overlay for page one
var imgOne = new AR.ImageResource("assets/imageOne.png");
var overlayOne = new AR.ImageDrawable(imgOne, 1, {
  offsetX: -0.15,
  offsetY: 0
});
var pageOne = new AR.Trackable2DObject(this.tracker, "pageOne", {
  drawables: {
  cam: overlayOne
}
});

и снова мы заявляем

// Create overlay for page two
var imgTwo = new AR.ImageResource("assets/imageTwo.png");
var overlayTwo = new AR.ImageDrawable(imgTwo, 0.5, {
  offsetX: 0.12,
  offsetY: -0.01
});
var pageTwo = new AR.Trackable2DObject(this.tracker, "pageTwo", {
  drawables: {
   cam: overlayTwo
}
});

Вместо этого я хочу поместить их в цикл. Я нашел другую тему с похожей проблемой, и решение:

loop(condition){
  new AR.Trackable2DObject(this.tracker, "targetName", {
   drawables: {
   cam: new AR.ImageDrawable(new AR.ImageResource("assets/targetImage.png"), 1, {
   offsetX: -0.15,
   offsetY: 0
  })
 }
 });
}

But my overlay is html with URL, so when i tried


for(i=0;i<targetList.length;i++){
            new AR.Trackable2DObject(this.tracker, targetList[i], {
            drawables: {
               cam: [clickMeOverlay, sparkles,
               new AR.HtmlDrawable({
                  uri: htmlAssetFolder+targetList[i]+".html"
                  }, 1, {
                     offsetX: 1,
                     offsetY: 0,
                     horizontalAnchor: AR.CONST.HORIZONTAL_ANCHOR.RIGHT,
                     verticalAnchor: AR.CONST.VERTICAL_ANCHOR.TOP,
                     clickThroughEnabled: true,
                     onClick: function() {
                        document.location = "architectsdk://"+targetList[i];
                        return true;
                        }
                  })
               ]
            }
         });

все цели в списке могут быть распознаны с правильным наложением. но когда я нажимаю на наложение, все они ведут к одному и тому же URL-адресу, который является последним элементом в списке. Я пытался в течение нескольких часов T^T за вашу любезную помощь, пожалуйста. огромное спасибо!!!!


person Alvida    schedule 07.08.2015    source источник


Ответы (1)


Вам нужно немного узнать о замыканиях JavaScript.

Проблема в том, что каждая из ваших функций onClick использует одну и ту же переменную i, объявленную во внешней области видимости. Правила закрытия означают, что при вызове onClick() значение i будет последним присвоенным ему значением.

Один из способов решить эту проблему - разрешить URL-адрес вне onClick() - вы можете попробовать просто сохранить разрешенное значение в самом объекте:

for(var i=0;i<targetList.length;i++){
            new AR.Trackable2DObject(this.tracker, targetList[i], {
            drawables: {
               cam: [clickMeOverlay, sparkles,
               new AR.HtmlDrawable({
                  uri: htmlAssetFolder+targetList[i]+".html"
                  }, 1, {
                     offsetX: 1,
                     offsetY: 0,
                     horizontalAnchor: AR.CONST.HORIZONTAL_ANCHOR.RIGHT,
                     verticalAnchor: AR.CONST.VERTICAL_ANCHOR.TOP,
                     clickThroughEnabled: true,
                     url: "architectsdk://"+targetList[i],
                     onClick: function() {
                        // assumes 'this' context points to the current object
                        document.location = this.url;
                        return true;
                        }
                  })
               ]
            }
         });
person adelphus    schedule 07.08.2015
comment
Спасибо за оперативный ответ! к сожалению пока не работает... :'( - person Alvida; 08.08.2015
comment
@hacker2007, не удалось решить. кодирует все накладки отдельно - person Alvida; 16.06.2016
comment
Я злоупотребил свойством zOrder объектов Drawable2D, чтобы сохранить текущий индекс массива в объекте. В массиве хранятся словари, отображающие URL-адрес: architectsdk://.... В функции onClick я определяю правильный URL-адрес следующим образом: var url = myArray[this.zOrder][url]; - person RTasche; 16.06.2016