Magento / JavaScript / Prototype: нужна информация о пространствах имен во вложенных вызовах AJAX - PullRequest
0 голосов
/ 21 февраля 2012

Я пытаюсь изменить некоторый код в Magento, чтобы создать пару вызовов AJAX так, чтобы второй вызов активировался только в случае успешного выполнения первого.В частности, я пытаюсь вставить дополнительный код проверки адреса на страницу выставления счета при оформлении заказа, чтобы стандартное сообщение проверки Magento + форма (через AJAX) происходило только в том случае, если адрес проверяется как действительный почтовый адрес.

Моя проблема возникает из-за попытки ссылаться на определенные функции во внутреннем вызове, где я сталкиваюсь с некоторыми проблемами с пространством имен.Пример кода:

var Billing = Class.create();
Billing.prototype = {
initialize: function(form, addressUrl, saveUrl){
    this.form = form;
    if ($(this.form)) {
        $(this.form).observe('submit', function(event){this.save();Event.stop(event);}.bind(this));
    }
    this.addressUrl = addressUrl;
    this.saveUrl = saveUrl;
    this.onAddressLoad = this.fillForm.bindAsEventListener(this);
    this.onSave = this.nextStep.bindAsEventListener(this);
    this.onComplete = this.resetLoadWaiting.bindAsEventListener(this);
},

save:  function() {
    //(initialize things for first call, e.g., URL to use):
    var addressRequest = new Ajax.Request(url, 
        {
          method: 'get',
          onSuccess: function(response)  {
              // (do some things with the results...)

              // (initialize things for second call, which was 
              // the stock Magento AJAX call to validate form fields 
              // and post the results to another Web page...)

              var request = new Ajax.Request(
                  this.saveUrl, // no longer in scope
                  {
                        asynchronous: true,
                        method: 'post',
                        onComplete: this.onComplete, // also no longer in scope
                        onSuccess: this.onSave, // also no longer in scope
                        onFailure: checkout.ajaxFailure.bind(checkout), // "checkout" is a distinct object and remains in scope
                        parameters: Form.serialize(this.form) // this.form no longer in scope
                  }
              );
          }
      }
  },

  fillForm: function(transport) { ... }, 

  nextStep:  function(transport) { ... },

  resetLoadWaiting: function(transport) { ... },

Исходные ссылки "this.xxx", такие как this.form и this.onComplete, больше не находятся в области действия после того, как они находятся во вложенном вызове.Я хотел бы знать, как правильно ссылаться на них на любой вложенной глубине (есть пара других вызовов AJAX, которые я также хотел бы сделать здесь).Любые предложения будут с благодарностью!

1 Ответ

1 голос
/ 21 февраля 2012

Попробуйте

onSuccess: function(response)  {
...
}.bind(this);
...