2013-05-27 5 views
1

У меня есть user_permissions переменная, и я определил, что для глобального использования, после установки этого метода post, у меня нет проблемы с печатью, но после использования этой переменной во многих строках ниже я получаю null результат? ??jQuery can not use variable в основной области

JQuery (минимальный код):

var user_permissions = null; 
    $(document).ready(function(e) { 
       $.post('model/controller.php' ,{ username:iId_username , postaction:'getUserPermission' }, 
         function(data){ 
          user_permissions=0; 
          user_permissions = data.user_permissions; 
          console.log(user_permissions); // RESULT is : {"user_permissions":"8"} 
       },'json'); 
       $.each(listPermissions, function(i, item) { 
         if (user_permissions == listPermissions[i].id) selected = "selected='selected'"; else selected = ''; 
         console.log(user_permissions); // RESULT is : null 
         selectElement += "<option value='" + listPermissions[i].id + "' "+ selected + ">" + listPermissions[i].permission_title + "</option>"; 
       }); 

}); 

, Что моя проблема кода?

+1

Вы не поняли, как работает _asynchronous_ script в JavaScript. – CBroe

ответ

2

Это потому, что .post() является асинхронным и ваша .each() выполняется, прежде чем ваш пост даже завершен,

Вы должны переместить .each() в пост обратного вызова

$.post('model/controller.php', { 
    username: iId_username, 
    postaction: 'getUserPermission' 
}, 

function (data) { 
    user_permissions = 0; 
    user_permissions = data.user_permissions; 
    console.log(user_permissions); // RESULT is : {"user_permissions":"8"} 
    $.each(listPermissions, function (i, item) { 
     if (user_permissions == listPermissions[i].id) selected = "selected='selected'"; 
     else selected = ''; 
     console.log(user_permissions); // RESULT is : null 
     selectElement += "<option value='" + listPermissions[i].id + "' " + selected + ">" + listPermissions[i].permission_title + "</option>"; 
    }); 
}, 'json'); 
1

Код в $ .each части является выполнение перед завершением вызова $ .post.

Javascript является асинхронным, поэтому он продолжает выполнять код, не дожидаясь завершения предыдущей вещи.

Вы можете попробовать что-то вроде $ .when убедиться, что что-то было выполнено, прежде чем двигаться дальше, или поместить его в функцию обратного вызова для того, что вы ожидаете.

0

после изменения кода ниже, мой номер select не смог заполнить, но я могу печатать на консоли.

selectElement = "<select style='width:100%;'>"; 
$.post('model/controller.php', { 
    username: iId_username, 
    postaction: 'getUserPermission' 
}, 
function (data) { 
    user_permissions = 0; 
    user_permissions = data.user_permissions; 
    // selectElement = "<select style='width:100%;'>"; 
    $.each(listPermissions, function (i, item) { 
     if (user_permissions == listPermissions[i].id) selected = "selected='selected'"; else selected = ''; 
     selectElement += "<option value='" + listPermissions[i].id + "' " + selected + ">" + listPermissions[i].permission_title + "</option>"; 
    }); 
    // selectElement += "</select>"; 
    // $('td :eq(5)',this).html(selectElement); 
}, 'json'); 
selectElement += "</select>"; 
$('td :eq(5)',this).html(selectElement);