充分利用我的工厂

Making the most of my factory

我是 Angular 的新手,所以如果你问这个问题:"Why don't you...?"答案是......因为我不知道我可以。

让工厂进行 API 调用,然后将该工厂注入到父控制器中,该控制器的作用域将覆盖整个页面。然后嵌套子控制器并从父控制器继承。

这是我目前所拥有的。我可能离这里很远,如果是这样,请告诉我。我一个人在做这件事,没有任何帮助,所以欢迎任何帮助。

谢谢。

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

app.factory('myFactory', function($http){
    var MyFactory = function(){};

    MyFactory.getParams = function(){
        return $http.get('/getparameters');
        .success(function(data){
            var roomname = data.roomname;
        })
        MyFactory.getRoom(roomname);
    };

    MyFactory.getRoom = function(room){
        return $http.get('/my/api/' + room);
    };


});

app.controller('RoomCtrl', function($scope, myFactory){
    $scope.data = myFactory;        
});

你不需要使用resource,你需要使用promise; 已编辑 我试着让你更清楚

app.factory('apicall', ['$q','$http',function($q, $http){

    function getRoom(options){
      var promise =  $http.get(options.paramUrl)
                    .success(function(data){
                         //handle your error
                         return $http.get(options.roomUrl + data.roomname);              
                     })
                     .error(function(msg){
                          return $q.when(msg)
                      })   
           return promise;
    }

   return {getRoom:getRoom};
 }])

如果你想在你想要的地方打电话给你的工厂

app.controller('RoomCtrl', ['$scope','apicall',function($scope, apicall){
       var options = {
                        paramUrl:'/getparameters',
                        roomUrl:'/my/api/'
                     }
       apicall.getRoom.all(function(result){
            $scope.data = result; 
        })

  }]);

我通常在不同的工厂中分离不同的 API 调用,return 一个 $resource

例如,假设我们有 2 个不同的 API 调用指向不同的资源:

你的网站。com/user/:userId - return关于用户的数据

您的网站。com/photo/:photoId - return 一些照片的数据

在 angular 中,您可以将它们分成 2 个不同的工厂: "use strict";

angular.module("App.services").
factory("User",["$resource", function($resource){
    return $resource("yourwebsite.com/user/:userId"),{userId:"@userId"});
}]);

第二个

angular.module("App.services").
factory("Photo",["$resource", function($resource){
    return $resource("yourwebsite.com/photo/:photoId"),{photoId:"@photoId"});
}]);

在您的控制器中,您可以像这样使用它们:

angular.module("App.controllers").controller("TestController",["User","Photo", function(User, Photo){
    User.get({
        id:10
    }).$promise.then(function(data){
            console.log(data); //returns the data for user with the id=10
        });

    Photo.get({
            id:123
    }).$promise.then(function(data){
                console.log(data);
    });

}]);

通常 $resource$resource 上映射一个 CRUD API(what I posted above is a basic example of a GET call).Check out the documentation - 它已经有基本的 GET, PUT, POST, DELETE 函数。

如果您对 URL 只有 1 个简单操作而不是全部 4 个,我建议使用 $http。然后,您可以在控制器中注入 $http 并在那里执行请求,而不是为其创建工厂。

如果您有 2 个请求并且它们是链接的(第二个请求取决于从第一个请求收到的数据),您必须等到第一个请求得到解决。使用 $resource,您可以按以下方式执行此操作:

angular.module("App.controllers").controller("TestController",["User","Photo", function(User, Photo){
        var user_promise = User.get({
            id:10
        }).$promise.then(function(data){
                console.log(data); //returns the data for user with the id=10
                return data;

            });

        var photo_promise = Photo.get({
                id:123
        }).$promise.then(function(data){
                    console.log(data);
                    return data;
        });

     user_promise.then(photo_promise).
      catch(function(error){
        console.log(error); //catch all errors from the whole promise chain
     });

    }]);

$q 服务帮助您处理两个异步调用的组合

app.factory('apicall', function($q, $http) {
  var deferred = $q.defer();

  $http.get('/getparameters')
    .success(
      function(data) {
        var roomname = data.roomname;
        $http.get(baseURL + 'room/' + roomname)
          .success(
            function(roomData) {
              deferred.resolve(roomData);
            }
        )
          .error(
            function() {
              deferred.reject();
            }
        )
      })
    .error(
      function() {
        deferred.reject();
      }
  );

  return deferred.promise;
});

这是您可以使用服务的控制器

app.controller('someCtrl', function(apicall) {
  apicall.then(
    function(roomData) {
      //success
    },
    function() {
      //error
    }
  )
})