views:

153

answers:

1

I am writing a game for Facebook. IN the following code, I have a problem. I have a for loop executing, and in that loop, I call a dialog and implement 'onconfirm' for the dialog. The problem is that I need to access th e loop counter inside of the onconfirm function. But because the onconfirm is called outside of the scope of the for loop, the counter value is no longer valid because it's been incremented. I need some way to pass the counter value to the dialog onconfirm as it was at the time the dialog was displayed, not after the loop has finished. Or maybe someone has a better solution. Any help would be appreciated. Thanks.

function unloadCargo() {
//debugger;
  var actionPrompt = document.getElementById('action-prompt');
  actionPrompt.setTextValue('Unloading cargo...');

  var ajax = new Ajax();
  ajax.responseType = Ajax.JSON;
  ajax.ondone = function(data) {
debugger;
    if(data.unloadableCargo.length == 0) {
      loadCargo();
    } else {
//console.log('unloadable cargo='+dump(data.unloadableCargo));
      var i = 0;
      var j = 0;
      var ucCount = data.unloadableCargo.length;
      for(i = 0; i < ucCount; i++) {
        cargoDialog = new Dialog();
        cargoDialog.showChoice('Unload Cargo', 'Unload  ' + data.unloadableCargo[i].goods_name + ' at ' + data.unloadableCargo[i].city_name + ' for ' + data.unloadableCargo[i].payoff + 'M euros?');
        cargoDialog.onconfirm = function() {
//console.log('unloadable cargo onconfirm='+dump(data.unloadableCargo));
          var ajax = new Ajax();
          var param = {"city_id": data.unloadableCargo[i].city_id, "goods_id": data.unloadableCargo[i].goods_id, "payoff": data.unloadableCargo[i].payoff};
          ajax.ondone = function(demandData) {
            var demands = document.getElementById('demands');
            var innerXhtml = '<span>';
            for(var j = 0; j < demandData.demands.length; j++) {
              innerXhtml = innerXhtml + '      <div class="demand-item"><div class="demand-city">' + demandData.demands[j].city + '</div><div class="demand-pay">' + demandData.demands[j].cost + '</div><div class="demand-goods">' + demandData.demands[j].goods + '</div></div>';
            }
            innerXtml = innerXhtml + '    </span>';
            demands.setInnerXHTML(innerXhtml);
            // update balance
            loadCargo();
          }
          ajax.post(baseURL + "/turn/do-unload-cargo", param);
        }
        cargoDialog.oncancel = function() { loadCargo(); }
      }
      //loadCargo();
    }
  }
  ajax.post(baseURL + '/turn/unload-cargo');
}
A: 

You need to pass the value to the dialog somehow.

I have never looked at the FBJS, but it seems setContext can be used for that.

Try this:

cargoDialog = new Dialog().setContext({currentIndex: i});
// showChoice is the same
cargoDialog.onconfirm = function() {
    alert(this.currentIndex); // Here you should be able to get it
}
Dmytrii Nagirniak
setContext determine which dialog element has the focus.I got it working by adding the counter as a property of the dialog, then referring to it as 'this.property' in dialog.onconfirm.
Chris Barnhill