我成功创建了一个获取.php文件输出(JSON)的工厂,
我的问题是如何从控制器访问它:
myApp = angular.module("myApp", [])
myApp.factory "mainData", ($http) ->
$http.get('gethome.php').success (data) ->
data: data
console.log(data)
myApp.controller "HomeCtrl", ($scope, mainData) ->
$scope.home = mainData.data
如果我在这里选择正确的语法,请告诉我, 我在教程中看到了很多关于如何在任何地方创建模块/控制器的示例, 我正在寻找合适的方式
答案 0 :(得分:9)
将工厂注入Angular控制器时,注入的工厂参考包含您从工厂返回的成员:
myApp.factory("mainData", function($http) {
var mData = {};
$http.get('gethome.php').success(function(data) {
mData.data = data;
});
return mData;
});
myApp.controller("HomeCtrl", function($scope, mainData) {
$scope.home = mainData.data; // Here mainData equals mData object literal from the mainData factory
});
但是,您的代码的问题是mainData.data将始终未定义,因为factory将在async $ http请求完成之前返回。相反,你的工厂应该回复一个承诺:
myApp.factory("mainData", function($http) {
return $http.get('gethome.php');
});
myApp.controller("HomeCtrl", function($scope, mainData) {
mainData.success(function(data) {
$scope.home = data;
});
});
注意:$ http方法默认返回一个promise。
答案 1 :(得分:3)
您可以使用:
myApp.factory("mainData", function($http,$q) {
var def = $q.defer()
$http.get('gethome.php').then(function(data){
def.resolve(data)
});
return def.promise;
});
myApp.controller("HomeCtrl", function($scope, mainData) {
mainData.then(function(data) {
$scope.home = data;
});
});