2013-05-04 15 views
3

我試圖調用loadPhotos,但是我得到一個錯誤,提示loadPhotos沒有被定義。我試過this.loadPhotos();,但後來發現一個錯誤,說對象沒有這樣的方法。我在這方面很新穎,仍然試圖弄清楚什麼可以訪問什麼,以及如果有人能指出我正確的方向,我將不勝感激。我究竟做錯了什麼?

這裏是我的代碼:

Album = Backbone.Collection.extend ({ 
    model: Photo, 
    url: "/api/", 
    albumName: "", 
    initialize: function(models, options){ 
     options || (options = {}); 
     if (options.title) { 
      this.albumName = options.title; 
     }; 

     $.ajax({ 
      type: "GET", 
      url: this.url, 
      data: "album=" + this.albumName, 
      dataType: "json", 
      success: function(data){ 
       console.log(data); 
       loadPhotos(data); // <<< the problem is right here 
      }, 
      error: function(jqXHR, textStatus, errorThrown){ 
       console.log("FETCH FAILED: " + errorThrown); 
      } 
     }); 

    }, 

    loadPhotos: function(filenames){ 
     for (var i = 0; i < filenames.length; i++){ 

      var photo = new Photo({fileurl: filenames[i] }); 
      var photoView = new PhotoView({ model: photo}); 
      this.add(photo); 

     } 


    } 


}); 

回答

4

你是誤解如何確定範圍和在JavaScript this工作。

調用像

loadPhotos(data); 

將尋找一個名爲在不同範圍loadPhotos從您的成功回調到全球範圍內的功能,但是不存在這樣的功能,因爲該功能連接到您的收藏實例的功能。

this.loadPhotos(data) 

更接近,但完全取決於this引用的內容。 this是JavaScript中的一個特殊關鍵字,它指向的對象取決於函數的調用方式。在你的情況下,this完全取決於jQuery的行爲。您想要使用對集合的引用。通用名稱可以更容易地知道變量引用了對象,它們是self,that,有時是_this

做到這一點的一種方法是保存對引用集合的外部this指向的對象的引用。如果你將它保存到一個變量中,它會正常工作。

initialize: function(models, options){ 
    // Stuff 

    var self = this; 

    $.ajax({ 
     type: "GET", 
     url: this.url, 
     data: "album=" + this.albumName, 
     dataType: "json", 
     success: function(data){ 
      console.log(data); 

      // Call the function on the collection. 
      self.loadPhotos(data); 

     }, 
     error: function(jqXHR, textStatus, errorThrown){ 
      console.log("FETCH FAILED: " + errorThrown); 
     } 
    }); 

}, 

另一種選擇是做的參宿一@的回答說,並明確使用context屬性通過適當的回調上下文。

+0

很好解釋,謝謝! – Dmitry 2013-05-04 17:37:33

+3

實際上,設置'$ .ajax'上下文的_easiest_方法就是設置'context'選項...... – Alnitak 2013-05-04 20:29:24

4

如果您直接撥打showPhotos,它將具有全局範圍(即window)。

如果你只是this.showPhotos參考它不會工作,要麼因爲不會建立this被用作背景時,它隨後調用。

爲了解決這個問題,你還需要問jQuery來設置的this正確的價值,可與context選項來完成:

$.ajax({ 
    ..., 
    context: this, 
    success: this.loadPhotos, 
    error: ... 
}); 

如果你的成功確實什麼除了通話loadPhotos,設置context變量允許您直接傳遞該函數的引用(如上所述),而不是將調用包裝到另一個函數體中。