0

请帮忙,我无法解决这个问题。

function Tour(el) {
  var tour = this;
  this.el = el;
  this.fetchPhotos = function() { 
    $.ajax('/photos.html', {
      data: {location: tour.el.data('location')},
      context: tour,
      success: function(response) {
        this.el.find('.photos').html(response).fadeIn();
      },
      error: function() {
        this.el.find('.photos').html('<li>There was a problem fetching the latest photos. Please try again.</li>');
      },
      timeout: 3000,
      beforeSend: function() {
        this.el.addClass('is-fetching');
      },
      complete: function() {
        this.el.removeClass('is-fetching');
      }
    });
  }
  this.el.on('click', 'button', this.fetchPhotos);
}
$(document).ready(function() { 
  var paris = new Tour($('#paris'));
});

在上面的函数中,我知道函数内部的context: tour集合来引用 Tour。所以我的问题是为什么这部分代码可以更改为?thisthis.fetchPhotostour.el.data('location')this.el.data('location')

提前感谢您的帮助

4

2 回答 2

3

有效的原因是因为tour.el.data('location')被调用 from fetchPhotos

只要你做

new Tour().fetchPhotos();

并不是

var f = new Tour().fetchPhotos;
f();

替换将起作用。

但是做

this.el.on('click', 'button', this.fetchPhotos);

就像后者。它不一样。

于 2013-11-11T06:45:20.560 回答
0

正如 charlietfl 所写,这是 ajax 回调中的不同上下文,您必须this在 ajax 调用之前缓存到任何变量并使用该变量。就像你在tour变量中所做的那样:

function Tour(el) {
  var tour = this;
  this.el = el;
  this.fetchPhotos = function() { 
    $.ajax('/photos.html', {
      data: {location: tour.el.data('location')},
      context: tour,
      success: function(response) {
        tour.el.find('.photos').html(response).fadeIn();
      },
      error: function() {
        tour.el.find('.photos').html('<li>There was a problem fetching the latest photos. Please try again.</li>');
      },
      timeout: 3000,
      beforeSend: function() {
        tour.el.addClass('is-fetching');
      },
      complete: function() {
        tour.el.removeClass('is-fetching');
      }
    });
  }
  this.el.on('click', 'button', this.fetchPhotos);
}
$(document).ready(function() { 
  var paris = new Tour($('#paris'));
});

在 ajax 调用之外(如 click 事件绑定器)可以使用this,但在那些回调函数中,它指的是回调处理程序

于 2013-11-11T07:25:52.517 回答