簡體   English   中英

從AngularJS API服務返回值到控制器

[英]Return a value from AngularJS API service to controller

如果我有這樣的服務:

app.factory('User', function($http, User) {
    var User = function(data) {
        angular.extend(this, data);
    };
    User.prototype.create = function() {
        var user = this;

        return $http.post(api, user.getProperties()).success(function(response) {
            user.uid = response.data.uid;
        }).error(function(response) {

        });
    };

    User.get = function(id) {
        return $http.get(url).success(function(response) {
            return new User(response.data);
        });
    };

    return User;
});

如何在控制器中獲取在get()函數中創建的User

目前我擁有的是:

app.controller('UserCtrl', function($scope, User) {
    $scope.user = null;

    User.get($routeParams.rid).success(function(u) {
        $scope.user = new User(u.data);
    });
});

問題在於UserCtrl正在獲取api響應,而不是工廠中的success()返回的值。 我寧願在工廠中創建新用戶,而不是將api響應傳遞給控制器​​。

編輯:2015年5月5日

在嘗試回答這個問題時,我了解了延遲的反模式

因此,我們可以避免使用$q.defer()並使用以下代碼來實現相同的結果。

服務

User.get = function(id) {
    return $http.get(url).then(function(response) {
        return new User(response.data);
    });
};

控制者

User.get($routeParams.rid).then(function(u) {
    $scope.user = u;
});

原始答案如下:

我認為您正在尋找的是$q服務,該服務允許您對異步$http服務的響應進行一些后處理,然后將其作為承諾返回給控制器。 在此處查看文檔https://docs.angularjs.org/api/ng/service/$q

因此,在您的工廠中注入$q服務User.get如下所示更改User.get函數。

User.get = function(id) {
    var deferred = $q.defer();

    $http.get(url).success(function(response) {
        deferred.resolve(new User(response.data));
    }).error(function(error) {
        deferred.reject(error);
    });

    return deferred.promise;
};

然后在您的控制器中,您可以執行

User.get($routeParams.rid).then(function(u) {
    $scope.user = u;
}, function(error) {
    //log error
});

我認為您的回報有些混亂。 我個人可能會這樣寫

app.factory('User', function ($http) {

    var user = {
        new: function (data) {
            return $http.post(api, data);
        },
        get: function (id) {
            $http.get(url).success(function (response) {
                return user.new(response.data);
            });
        }
    };

    return user;

});

然后從您的控制器內部。

app.controller('UserCtrl', function($scope, User) {
    $scope.user = null;

    User.get($routeParams.rid).success(function(u) {
        $scope.user = u.data;
    });
});

有類似的問題,當我將“ response.data”傳遞給def.resolve時,它從控制器中拋出未定義的錯誤。 因此,直接通過了響應,它起作用了。

var def = $q.defer();
$http.get('http://localhost:3000/api/services')
      .success(function (response) {
          ***def.resolve(response);***              
      })
      .error(function (error) {              
          def.reject(error);
      });
      return def.promise;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM