2013-07-05 107 views
3

我succesfuly創建一個工廠,得到一個PHP文件輸出(JSON)之間的數據,份額http.get工廠和控制器

我的問題是如何從wihtin控制器訪問:

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 

請讓我知道,如果我在這裏選擇正確的語法, 我看到很多的例子就如何在教程隨處創建一個模塊/控制器, 和Im尋找合適的方式

回答

9

當工廠注入到gular控制器,注入的工廠引用包含你從工廠返回的成員:

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永遠是不確定的,因爲工廠將返回前異步$ 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方法總是默認返回一個承諾。

+0

大答案的Stewie, –

+0

我是這麼認爲的是迎接... – MURATSPLAT

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; 
    }); 
});