2014-07-21 49 views
1

我試圖創建一個將AJAX調用的結果存儲在變量中的工廠。到目前爲止,我有東西沿着這些路線:在工廠中設置局部變量作爲Ajax調用的結果

angular.module('frontApp') 
    .factory('myFactory', function(Restangular) { 
     var myFactory = function() { 
      this.loadedData = []; 
      loadData() 
     } 

     var loadData = function() { 
      Restangular.all('endPoint').customGET('path/run').then(
       function(success) { 
        this.loadedData = success.results; 
       } 
      ); 
     } 

     return stoppingPatternFactory; 
    }); 

但我得到一個錯誤:cannot set property 'loadedData' of undefined

據我所知,在這個上下文中的this關鍵字是指函數的上下文,這就是爲什麼我得到錯誤。問題在於,當Restangular調用是異步時,我無法在第一個函數中包裝如何設置this.loadedData。我試着在第一個函數中做出請求,並試圖在回調中設置變量,但我得到了同樣的錯誤。

編輯:我應該補充說,我試圖創建這個工廠的多個實例,例如var f = new myFactory(),這樣每個指令的實例都有自己的工廠與之相關聯。

+0

使用「這個」在工廠被錯誤使用。檢查這篇文章的正確使用:http://stackoverflow.com/questions/14324451/angular-service-vs-angular-factory/24442224#24442224 – pixelbits

+0

嗯 - 我只是簡單地看着這個,但它似乎是他們設置全球Factory的所有實例都可以使用的變量,我需要只對每個實例可用的變量。 – samturner

+0

工廠和服務單身 - 他們是全球性的。但是你可以實現一個getInstance(),每次調用它時都會返回一個新的對象。 – pixelbits

回答

0

我相信你要找的是「電話」或「申請」。它將允許您在設置其「this」引用時調用方法。然後,您可以保存該引用並在任何地方設置其屬性。像這樣的東西應該工作。

angular.module('frontApp') 
.factory('myFactory', function(Restangular) { 
    var myFactory = function() { 
     this.loadedData = []; 
     loadData.call(this); 
    } 

    var loadData = function() { 
     var self = this; 
     Restangular.all('endPoint').customGET('path/run').then(
      function(success) { 
       self.loadedData = success.results; 
      } 
     ); 
    } 

    return myFactory; 
}); 
1

您需要設置loadedData在隨後回調

angular.module('frontApp') 
.factory('myFactory', function(Restangular) { 

    var myFactory = function() { 
     var self = this; 
     self.loadedData = []; 
     loadData().then(function(data){ 
      self.loadedData = data; 
     }) 
    } 

    var loadData = function() { 
     var restApi = Restangular.all('endPoint') 
     return restApi.customGET('path/run').then(
      function(success) { 
       return success.results; 
      } 
     ); 
    } 

    return stoppingPatternFactory; 
});