2016-03-02 41 views
0

我想創建一個工廠,它向某些API發出ajax請求,然後返回一個數據對象。我的代碼是:從工廠傳遞對象到控制器

app.factory('Test', function($http, $q) { 
    var data = {response:{}}; 
    var getMessages = function() { 
     $http.get('https://someapi.com').then(
      function(jsonAPI) {    
       var dataObj = {}; 
       var messages = []; 

       $.each(jsonAPI.data.data, function(x, data) { 
        dataObj[x] = data; 
        $.each(jsonAPI.data.included, function(y, included) { 
         if(data.relationships.sender.data.id == included.id) { 
          dataObj[x].sender = included; 
         } 
        }); 
        messages.push(dataObj[x]); 
       }); 
       data.response = messages; 
      }, 
      function(errorResponse) { 
      // todo handle error. 
      } 
     );  
    }; 
    getMessages(); 

    return { 
     data 
    }; 
}); 

然而,當我嘗試刪除所創建的數據對象中的「響應」屬性,有data = messages,而不是data.response = messages數據對象沒有被填滿。如果我在試用console.log(Test.data['response'])時將響應屬性保存在我的控制器中,則會收到一個空對象。 console.log(Test.data)雖然返回一個有效的對象。我在這裏錯過了什麼?

+0

這將致力於填充視圖如果通'data.response'通過範圍....但你有問題,它記錄因爲'$ http'是異步的。當你使它成爲一個原始的時候沒有繼承,所以角度不會檢測到變化 – charlietfl

+0

@charlietfl那麼我怎樣才能記錄Test.data而不是Test.data ['response']? –

+0

回覆諾言更常見......並且在諾言回調中設置範圍。會在一分鐘內給你解決方案 – charlietfl

回答

1

如果您希望將數據存儲在工廠中,您可以存儲由$http返回的許諾,並使用存儲的數據解決該許諾。

app.factory('Test', function($http, $q) { 

    var data = null, dataPromise = null; 

    function getMessages() { 

     if (!dataPromise) { 
      dataPromise = $http.get('https://someapi.com').then(
        function (jsonAPI) { 
         var dataObj = {}; 
         var messages = []; 

         $.each(jsonAPI.data.data, function (x, data) { 
          dataObj[x] = data; 
          $.each(jsonAPI.data.included, function (y, included) { 
           if (data.relationships.sender.data.id == included.id) { 
            dataObj[x].sender = included; 
           } 
          }); 
          messages.push(dataObj[x]); 
         }); 
         data = messages; 

         return data; 

        }, 
        function (errorResponse) { 
         // todo handle error. 
        } 
      ); 
     } 

     return dataPromise 

    } 

    return { 
     getMessages : getMessages 
    }; 

}); 

然後在任何控制器或指令或決心:

Test.getMessages().then(function(messages){ 
    $scope.messages = messages; 
}); 
+0

這工作得很好!還有一個問題,這個邏輯在我看來更像是一種服務而不是工廠。我將如何改變它成爲一項服務? –

+0

他們幾乎是一樣的...只是服務使用'this'成員和工廠的構造函數返回一個對象。可以谷歌'差角服務工廠'..在這裏和網站上的文章不少文章 – charlietfl

相關問題