2016-02-02 43 views
0

很抱歉,但我對AngularJS新的,我不明白這種行爲......廠返回undefined所有的時間

我試圖用一個工廠,但我總是得到一個未定義的響應它...

所以,我有一個叫pollsData的工廠,這個工廠是在AddDataPollController控制器裏注入的,我使用的是工廠的getPoll方法,注意我打印什麼是從工廠函數返回的...

.controller('AddDataPollController', ['$scope', 'Restangular', '$state', '$stateParams', 'pollsData', // factory 
function($scope, Restangular, $state, $stateParams, pollsData) { 
    console.log(pollsData.getPoll()); 
. 
. 
. 

然後,在getPoll方法中,我製作了一個Restangul ar請求獲得id爲192的輪詢,在這個相同的函數中,我打印從重新發送的請求返回的內容。

.factory('pollsData', ['Restangular', '$state', '$stateParams', 
    function(Restangular, $state, $stateParams) { 

    var data = { 
    polls: [] 
    }; 

    data.getPoll = function() { 
    Restangular.one('polls', 192).get().then(function(poll) { 
     console.log(poll); 
     angular.copy(poll, data.polls); 
     return poll; 
    }); 
    }; 

    return data; 
}]) 

現在我不明白的是,當我打印從工廠的迴應,我看到正確的數據,但是當我嘗試從控制器打印什麼,我得到它只是顯示單詞定義,不應該在兩種情況下都打印同一個對象嗎?

console

+0

因爲當你登錄運行的要求仍在處理中。它是**異步** – tymeJV

回答

0

你這裏處理async邏輯。您需要返回解決方案並使用響應,或返回解決方案,然後參考工廠數據。

更新:

.factory('pollsData', ['$q','Restangular', '$state', '$stateParams', 
    function($q Restangular, $state, $stateParams) { 

    var data = { 
    polls: [] 
    }; 

    data.getPoll = function() { 
    var deferred = $q.defer(); 
    Restangular.one('polls', 192).get().then(function(poll) { 
    console.log(poll); 
    angular.copy(poll, data.polls); 
    return deferred.resolve(poll); 
    }, deferred.reject); 
    return deferred.promise; 
    }; 
return data; 
}]) 

在你的控制器:

pollsData.getPoll().then(setData, onError); 

function setData(data){ 
    console.log(data); 
} 
function onError(error){ 
    console.error(error); 
} 
+0

你可以使用事件以及像$ scope.broadcast和$ scope.on – molson504x

+0

呃,我不喜歡使用事件進行數據傳遞。如果你正在考慮什麼時候應用引導程序讓系統知道某些東西是可用的,但在這種情況下,我更喜歡使用延遲的。 – Nix