3

我成功创建了一个获取 .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

如果我在这里选择了正确的语法,请告诉我,我在教程中看到很多关于如何创建模块/控制器的示例,我正在寻找正确的方法

4

2 回答 2

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 将始终未定义,因为工厂将在异步 $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。

于 2013-07-05T14:43:20.410 回答
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;
  });
});
于 2014-05-06T15:30:28.483 回答