2010-03-19 5 views
0

Je dois manquer quelque chose de simple, mais je ne sais pas trop quoi. Je ne suis pas un vétéran de JS, donc ceci peut être une réponse facile - j'espère bien :).Variable javascript globale non accessible dans jquery change event

J'ai un bouton qui, une fois cliqué, obtient des données de JSON. Quand une liste déroulante est changée, je vérifie s'il y a des données, si c'est le cas, je veux les effacer puisque la liste déroulante indique les données à récupérer quand on clique sur le bouton

Le Code:

var selected, $locDialog; 
var locations = []; 

$(function() { 
// Save the selected Name 
selected = $("#selected option:selected").val(); 

// Setup Dialog for Locations 
$locDialog = $('#location-dialog').dialog({ 
    autoOpen: false 
}); 

// If user changes the selected 
// 1. Prompt for confirmation 
// 2. If users confirms, clear data 
$('#selected').change(function() { 
    if (locations) { 
     var confirmed = confirm("Oh Rly?"); 
     if (confirmed) { 
      // Clear data 
      var locations; 
     } 
    } 
}); 

// When user clicks "Location" Button.. 
$('.loc-select button').click(function() { 
    if (!locations) { 
     $.getJSON("/Controller/JSONAction", { selectedId: selected, pageNum: 1, pageSize: 100 }, function(data) { 
      locations = data; 
      $.each(locations, function(index, loc) { 
       var $tr = $('<tr/>') 
        .append($('<td/>') 
         .append('<input type="checkbox" name="TEST-'+index+'" value="'+loc.Id+'"/>')) 
        .append('<td>' + loc.Name + '</td>'); 
       $("#location-dialog table tbody").append($tr); 
      }); 
     }); 
    } 
    $locDialog.dialog('open'); 
    return false; 
}); 

});

Voici la chose, Dans le rappel .click(...), je peux voir locations est []. Maintenant, quand je suis dans le rappel .change(...), je vois locations est undefined.

Toute aide/compréhension, comme toujours, est appréciée!

Répondre

5

Essayez de changer cette ligne ...

// Clear data 
var locations; 

à cette ...

// Clear data 
locations = []; 

Voici ce qui se passe: vous déclarer une nouvelle variable « lieux » qui couvre une mondiale . En JavaScript, toutes les variables déclarées dans la fonction sont visibles dans toute la fonction - même si elles sont déclarées dans (ce qui vous ressemble) une portée imbriquée.

+0

Merci Drew :). Question: les emplacements var à l'intérieur du callback ne sont pas exécutés tout de suite, n'est-ce pas? Je suppose que c'est pourquoi je n'ai jamais pensé à changer cela. Je savais que c'était quelque chose de simple cependant! – Dan