2015-06-11 2 views
2

В приведенном ниже коде я вызываю функцию loadAuthorsList, которая затем должна передать свою информацию функции loadTemplate. Но мне сообщают firebug, что «this.loadTemplate» не является функцией. Почему и как я могу это исправить?Объект jquery, вызывающий функцию внутри себя

var LI = { 
     sFI: x, 
    loadAuthorsList: function() { 
      myApp.showPleaseWait(); 
      //for later 
      $('#records_table').find('tr:gt(0)').remove(); 
      jQuery.ajax({ 
       url: this.sFI.getServiceRoot('A'), 
       type: 'POST', 
       dataType: 'json', 
       data: {}, 
       beforeSend: this.sFI.setModuleHeaders, 
       success: function (data) { 
        this.loadTemplate('AuthorTemplate', '#author_records', data) 
       }, 
       complete: function() { 

       } 
      }); 
     }, 

    loadTemplate: function (templateName, selectorName, inputData) { 
      var jsPath = this.serviceFrameInstructors.getServiceRoot('LearnoogleInstructors'); 
      jQuery.ajax({ 
       url: jsPath.slice(0, -4) + 'js/templates/' + templateName + '.html',// + intArea, 
       cache: false, 
       success: function (value) { 
        var personTemplate = $.templates(value); 
        var html = personTemplate.render(inputData); 
        $(selectorName).html(html); 
       } 
      }); 
     } 
    }; 
+0

Вы не находитесь в контексте объекта. Вместо этого вы можете использовать 'LI.loadTemplate'. –

ответ

2

Потому что в успех обратного вызова this указывает на другой объект (XHR). Вы можете связать контекст явно с Function.prototype.bind, например:

success: function (data) { 
    this.loadTemplate('AuthorTemplate', '#author_records', data) 
}.bind(this), 

Или проще, вы можете сохранить ссылку на правильный контекст в переменной:

var self = this; 
jQuery.ajax({ 
    url: this.sFI.getServiceRoot('A'), 
    type: 'POST', 
    dataType: 'json', 
    data: {}, 
    beforeSend: this.sFI.setModuleHeaders, 
    success: function (data) { 
     self.loadTemplate('AuthorTemplate', '#author_records', data) 
    }, 
    complete: function() { 

    } 
}); 

Или один больше вариантов: использование может использовать параметр JQuery context для обеспечения контекст для обратных вызовов AJAX:

context: this, 
success: function (data) { 
    this.loadTemplate('AuthorTemplate', '#author_records', data) 
}, 
+0

Это хороший способ сделать это? – braindice

+0

@braindice - это соглашение в JS для решения этого простого, часто встречающегося обстоятельства. – Adam

+0

@braindice Я бы рекомендовал вам использовать bind. Эта страница расскажет вам об этом, а также о тонкостях вызова функций в JavaScript https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind – Olical

Смежные вопросы