2013-11-04 57 views
0

我是新來的主幹,我想了解如何在我的視圖中維護範圍。在JavaScript中,我通常將對象設置爲某種類,並使用self = this來維護整個類的範圍。我試圖在骨幹中做同樣的事情。我有這種設置:主幹 - 在Ajax調用中丟失對象和函數的範圍

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); 

所以,你可以在最後一行,我試圖維持引用我的鳴叫數組,所以我可以每個鳴叫推到看到它,但它無法找到陣列鳴叫。我如何保持這個範圍?

+0

如何'loadTweets'被稱爲? –

+0

啊對不起 - 看到更新的問題。 – mheavers

回答

1

我想通了 - 用jQuery的Ajax你可以使用上下文:這是一個對象參數,所以然後在裏面你仍然可以參考this.tweets

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; 
+0

我試過了 - 如果我使用self,那麼當我嘗試從ajax成功調用中記錄它時,我會得到應用此視圖的DOM元素的作用域。並非所有包含在這個對象中的函數,比如推文(我需要) – mheavers

+0

'console.log(self.tweets)'正確記錄(一個數組) – wachme

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;然後...

+0

@mheavers oops,你不可以嗎? – benhowdle89