Използване на цикъл за множество цели в 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 Closures.

Проблемът е, че всяка от вашите функции 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