jQuery - Проблема переменной области - PullRequest
1 голос
/ 30 ноября 2010

У меня есть следующий JavaScript:

      $.getJSON('/calculate_quote/' + moulding_1_id, function(data) {
        moulding_1_cost = data.moulding.cost;
        moulding_1_width = data.moulding.width;
      });
      cost_of_moulding = ( ( 2 * ( width + ( 2 * moulding_1_width ) ) + 2 * ( height + ( 2 * moulding_1_width ) ) ) / 1000 ) * moulding_1_cost;
      $('#item_total').html( cost_of_moulding );

Проблема в том, что две переменные moulding_1_cost и moulding_1_width не определены вне вызова getJSON.Как сделать эти две переменные доступными вне вызова getJSON?

Ответы [ 4 ]

7 голосов
/ 30 ноября 2010

Переменные не установлены до тех пор, пока не будет запущен этот обратный вызов (когда сервер возвращается с данными JSON), поэтому вам нужно вызывать любой код, использующий их из этого обратного вызова, например:

$.getJSON('/calculate_quote/' + moulding_1_id, function(data) {
  var moulding_1_cost = data.moulding.cost;
  var moulding_1_width = data.moulding.width;
  var cost_of_moulding = ( ( 2 * ( width + ( 2 * moulding_1_width ) ) + 2 * ( height + ( 2 * moulding_1_width ) ) ) / 1000 ) * moulding_1_cost;
  $('#item_total').html( cost_of_moulding );
});

Или вызовите другую функцию, подобную этой:

$.getJSON('/calculate_quote/' + moulding_1_id, function(data) {
  someFunction(data.moulding.cost, data.moulding.width);
});
function someFunction(mqc, m1w) {
  var cost_of_moulding = ( ( 2 * ( width + ( 2 * m1w) ) + 2 * ( height + ( 2 * m1w) ) ) / 1000 ) * m1c;
  $('#item_total').html( cost_of_moulding );
}

В любом случае остается верным то, что вам нужно запускать все, что использует данные , как только у вас есть данные , всеасинхронные операции похожи на это.

0 голосов
/ 30 ноября 2010

Infact они не являются неопределенными (после выполнения кода).Пропуская ключевое слово var, эти имена попадают непосредственно в глобальную область (которая в большинстве случаев .. window).Таким образом, вы можете получить доступ к window.moulding_1_cost из любого места вашего скрипта, как только этот фрагмент скрипта будет выполнен.Поскольку это обработчик успеха ajax request, этот код выполняется асинхронно и, следовательно, не выполняется мгновенно.

Для решения этой проблемы рекомендуется использовать функцию обратного вызова по своему усмотрению.У ответа Ника Крейвера довольно хорошая демонстрация этого.

0 голосов
/ 30 ноября 2010

Вы должны делать все внутри вызова getJSON, чтобы убедиться, что это происходит в правильном порядке.

0 голосов
/ 30 ноября 2010

добавить

var moulding_1_cost;
var moulding_1_width;

вне какой-либо функции javaScript;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...