2016-05-12 39 views
0

我希望我的$ http響應數據可供控制器使用,以便通過指令(「{{hint}}」)在視圖中顯示JSON數據。但是,雖然在控制器中,我可以從工廠記錄數據,但數據不會以可用方式提供。

當控制器記錄了工廠提供的內容時,它是「未定義」或「不是功能」。從下面的代碼,「不確定」登錄」

請幫助我的權利我的過錯如何清理這件事,這樣才能在控制器使用工廠。獲得數據

控制器:??

var MainCtrl = angular.module('MainCtrl', []); 

MainCtrl.controller('Ctrl2', [ "QuizViewServ", '$log', '$scope', 
function(QuizViewServ, $log, $scope){ 


$scope.init = function(){ 
    $scope.hint = "FooBar"; //Testing binding bw Ctrl2 & the view 
    $log.log(QuizViewServ.getQuizData.quizQz); // <-LOGS AS "UNDEFINED" 
} 

}]); 

廠:

var MainServ = angular.module('MainServ', []); 

MainServ.factory('QuizViewServ', ['$http', function($http){ 
console.log("factory working"); 

var getQuizData = function(){ 

    $http({ 
     method: 'GET', 
     url: '/assets/json.json' 
    }).then(function successCallback(response) { 
     console.log("inside successgul GET req"); 


     var quizQz; 
     quizQz = response.data.quizQs; 
     console.log(quizQz); 


    }, function errorCallback(response) { 

     alert("Trouble grabbing requested data.") 
    }); 
    } 
    return { 
    getQuizData : getQuizData 
    } 

}]); 
+0

閱讀http://blog.ninja-squad.com/2015/05/28/angularjs-promises/ –

+0

@JBThis是一個偉大的文章。謝謝。 –

+0

....他拼寫「小馬」,壽。 :-/ 哈。 –

回答

1

$ HTTP使用承諾返回結果當使用QuizViewServ.getQuizData.quizQz你LO因爲它是異步的,所以什麼也沒有。

在您的工廠中,退還承諾,並在您的控制器中處理它。

var MainServ = angular.module('MainServ', []); 

MainServ.factory('QuizViewServ', ['$http', function($http){ 
console.log("factory working"); 

var getQuizData = function(){ 

    return $http({ 
     method: 'GET', 
     url: '/assets/json.json' 
    }) 
    } 
    return { 
    getQuizData : getQuizData 
    } 

}]); 

,並在控制器

var MainCtrl = angular.module('MainCtrl', []); 

MainCtrl.controller('Ctrl2', [ "QuizViewServ", '$log', '$scope', 
function(QuizViewServ, $log, $scope){ 


$scope.init = function(){ 
    $scope.hint = "FooBar"; //Testing binding bw Ctrl2 & the view 

    QuizViewServ.getQuizData().then(function(result){ 
     $log.log(result.data); 
    }); 
} 

}]); 
+0

這確實有用。正是你剛纔提到的原因,我忽略了。然而,這是否意味着迭代JSON文件對象的「業務邏輯」必須留在Controller中?爲了「清潔」,這個邏輯應該保存在服務中嗎? ---我不是在質疑你的答案,我真的很好奇。 –

+0

這取決於您是否需要對返回的數據進行不同的處理。如果每個使用它的控制器都有一定的獨特性,那麼應該在控制器內部完成。如果多個控制器需要相同的數據,那麼使用@Zohaib Ijaz的解決方案在工廠進行數據處理,它們都是有效的:P因此,基本上,您可以選擇兩種方式,取決於場景和個人偏好 –

+0

Gotcha。這完全有道理。是的,我已經嘗試過你和@Zohaib Ijaz的解決方案。正如你所說,他們都在不同的情況下工作。謝謝。 –

0

你需要retrun數據。這是不可能的,因爲你在做。 quizQz特性是私人的。即使在ajax調用之後設置了該值,也無法訪問它。

var getQuizData = function(){ 

return $http({ 
    method: 'GET', 
    url: '/assets/json.json' 
}).then(function successCallback(response) { 
    console.log("inside successgul GET req"); 


    var quizQz; 
    quizQz = response.data.quizQs; 
    console.log(quizQz); 
    return quizQz; 

    }, function errorCallback(response) { 

    alert("Trouble grabbing requested data.") 
    return ''; 
}); 

}

和控制器,得到這樣的數據。

QuizViewServ.getQuizData().then(function(data){ 
    console.log(data); 
}); 
+0

您不能在承諾中返回數據,您需要將其分配給在該承諾之外聲明的變量,或者返回該對象以處理承諾未來。我的答案是從promis中檢索數據的正確方法。返回返回promis的函數並處理它。 :http://stackoverflow.com/questions/26854654/get-data-out-of-a-promise-instead-of-returning-a-promise –

+0

我在我的生產應用程序中使用角度,我知道,我們可以返回數據,但我錯過了在$ http() –

+0

之前添加return語句然後,您將不得不從$ getQuizData()看結果,如果它的情況看起來像不好的做法,我好奇你怎麼做 –