2013-04-01 52 views
2

尝试从工厂返回数据并在工厂输出中记录正确的数据,但是一旦传递给控制器​​,它始终未定义。如果我在控制器内部有我的工厂逻辑,它将正常工作。所以它一定是简单的我在这里失踪?将工厂数据返回给控制器始终未定义

应用

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

    app.controller('animalController', ['$log', '$scope', 'animalResource', function($log, $scope, animalResource) { 
     $scope.list = function() { 
      $scope.list = 'List Animals'; 
      $scope.animals = animalResource.get(); // returns undefined data 
      $log.info($scope.animals); 
     }; 
     $scope.show = function() {}; 
     $scope.create = function() {}; 
     $scope.update = function() {}; 
     $scope.destroy = function() {}; 
    }]); 

    app.factory('animalResource', ['$http', '$log', function($http, $log) { 
     return { 
      get: function() { 
       $http({method: 'GET', url: '/clusters/xhrGetAnimals'}). 
        success(function(data, status, headers, config) { 
         //$log.info(data, status, headers, config); // return correct data 
         return data; 
        }). 
        error(function(data, status, headers, config) { 
         $log.info(data, status, headers, config); 
        }); 
      }, 
      post: function() {}, 
      put: function() {}, 
      delete: function() {} 
     }; 
    }]); 

日志信息

[Object, Object, Object, Object, Object, Object, Object, Object, Object, Object] 
    200 function (name) { 
     if (!headersObj) headersObj = parseHeaders(headers); 

     if (name) { 
      return headersObj[lowercase(name)] || null; 
     } 

     return headersObj; 
    } Object {method: "GET", url: "/clusters/xhrGetAnimals"} 
+1

'返回数据;'成功随叫随到返回不从'get'函数返回任何东西。尝试'返回$ http({method ...'。通过角度文档网站上的教程 – charlietfl

+0

好吧,你是正确的,在$ http之前添加一个返回。让它成为答案,我接受它。谢谢 – dynamo

回答

3

get()在服务方法不返回任何东西。 success回调中的return仅从该特定函数返回。

回报$http对象

0

澈这个例子中是如何使用的承诺,并返回工厂,那么你访问注射服务中的方法在您的控制器 使用点语法来访问你的定义函数服务

'use strict'; 
     var app; 

     app = angular.module('app.formCreator.services', []); 

     app.factory('formCreatorService', [ 
      '$http', '$q', function($http, $q) { 
      var apiCall, bjectArrarContainer, deferred, factory, webBaseUrl, _getFormElementsData; 
      factory = {}; 
      deferred = $q.defer(); 
      bjectArrarContainer = []; 
      webBaseUrl = 'https://tools.XXXX_url_XXXXX.com/XXXXXXX/'; 
      apiCall = 'api/XXXXX_url_XXXX/1000'; 
      _getFormElementsData = function() { 
       $http.get(webBaseUrl + apiCall).success(function(formElements) { 
       deferred.resolve(formElements); 
       }).error(function(err) { 
       deferred.reject(error); 
       }); 
       return deferred.promise; 
      }; 
      factory.getFormElementsData = _getFormElementsData; 
      return factory; 
      } 
     ]); 

然后像这样做,例如

'use strict'; 
      var app; 

      app = angular.module('app.formCreator.ctrls', []); 

      app.controller('formCreatorController', [ 
       'formCreatorService', '$scope', function(formCreatorService, $scope) { 
       $scope.formElementsData = {}; 
       formCreatorService.getFormElementsData().then(function(response) { 
        return $scope.formElementsData = response; 
       }); 
       } 
      ]); 
相关问题