【问题标题】:How to return data in a factory method within Angular?如何在Angular中的工厂方法中返回数据?
【发布时间】:2014-10-30 15:01:50
【问题描述】:

我是一个 ionic/Angular n00b,我无法思考如何做到这一点。

我有一个这样定义的工厂:

angular.module('starter.services', [])

.factory('Calendars', function () {

     var calendars;
     var success = function(message) {
        calendars = message;
        return calendars;
     };
     var error   = function(message) {alert("Error: " + message)};

     window.plugins.calendar.listCalendars(success,error);

     return {
         all: function() {
             return calendars;
         },
        get: function(calendarId) {
            return calendars[calendarId];
        }
     }


});

我正在尝试像这样在我的控制器中检索日历:

.controller('CalendarsCtrl', function($scope,Calendars) {

    $scope.calendars = Calendars.all();

})

正在调用工厂方法,但在调用 'success' 回调之前结果不可用,因此 CalendarsCtrl 始终未定义。

如何解决?

编辑 - 我已经更正了控制器中的调用。但同样的问题仍然存在,该函数在成功回调之前不会返回结果。

【问题讨论】:

  • 我注意到您没有在 success 回调之外定义 calendars。但即使你这样做了,你也应该使用$scope = Calendars.all() 检索控制器中的日历

标签: javascript angularjs factory


【解决方案1】:

你必须使用一个承诺。

首先添加依赖$q

.factory('Calendars', function ($q) {

然后在 all() 你这样做

all: function() {
    var deferred = $q.defer();

    window.plugins.calendar.listCalendars(function(data) {
        deferred.resolve(data);
    }
    ,function(error) {
        deferred.reject(error); // something went wrong here
    });
    return deferred.promise;

现在这将在 数据被解析后返回(不再是未定义的)。

最后一件事,现在当您在控制器中取回数据时,您可以这样做

var promise = Calendars.all();
promise.then(function(data) {
  console.log('Success: you can use your calendar data now');
}, function(error) {
  console.log('Failed for some reason:' + error);
});

你可以在这里阅读更多关于 Promise 的内容:https://docs.angularjs.org/api/ng/service/$q

我知道第一次很难掌握。

【讨论】:

    【解决方案2】:

    Angular 工厂正在返回一个对象,为了调用它们的方法,您必须使用 Calendar.all() 调用它们,这将调用内部函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      相关资源
      最近更新 更多