骨干 - 在ajax调用中丢失对象和函数的范围

时间:2013-11-04 11:54:56

标签: javascript ajax backbone.js scope backbone-views

我是骨干新手,我正在努力了解如何在视图中保持范围。在javascript中,我通常将对象设置为一种类,并使用self = this来维护整个类的范围。我正试图在骨干中做同样的事情。我有这样的设置:

var app = app || {};

app.TwitterView = Backbone.View.extend({

  el: '#twitter-container',
  tweets: [],
  initialize: function( templateContent ) {
    this.render(templateContent);
  },
  render: function(templateContent) {
    this.$el.html(this.template(templateContent));
    this.loadTweets();
    return this;
  },
  loadTweets: function(){
      console.log('load tweets');
      this.tweets = [];
      clearInterval(this.tweetCheckInterval,this.tweetCycleInterval);

      $.ajax({
        url: "scripts/php/mixitup.php",
        type: "GET",
        dataType: 'json',
        cache: false,
        success: function (data) {
          console.log(data);
          for (var i=0; i<data.statuses.length;i++){
            var tweet = {};
            tweet.status = data.statuses[i].text;
            tweet.user = data.statuses[i].user.screen_name;
            app.TwitterView.tweets.push(tweet);

所以你可以在最后一行看到我正在尝试维护对我的tweets数组的引用,所以我可以推送每个推文,但它找不到数组推文。我该如何保留这个范围?

3 个答案:

答案 0 :(得分:1)

我想出了这个 - 用jquery ajax你可以使用context:this作为一个对象参数,所以在里面你仍然可以引用this.tweets

答案 1 :(得分:0)

app.TwitterView是一个类型(类),您可以创建它的实例。所以你必须引用当前实例(this),而不是类名:

var app = app || {};

app.TwitterView = Backbone.View.extend({

  el: '#twitter-container',
  tweets: [],
  loadTweets: function(){

      var self = this;

      $.ajax({
        url: "scripts/php/mixitup.php",
        type: "GET",
        dataType: 'json',
        cache: false,
        success: function (data) {
          console.log(self.tweets) //need to be able to access that tweets array here.
          debugger;

答案 2 :(得分:0)

还可以使用.bind()来保持范围:

  $.ajax({
    url: "scripts/php/mixitup.php",
    type: "GET",
    dataType: 'json',
    cache: false,
    success: function (data) {
      console.log(data);
      for (var i=0; i<data.statuses.length;i++){
        var tweet = {};
        tweet.status = data.statuses[i].text;
        tweet.user = data.statuses[i].user.screen_name;
        this.tweets.push(tweet);
      }
    }.bind(this)

不需要var self = this;然后......