【问题标题】:Passing params to an angular service from a controller?将参数从控制器传递给角度服务?
【发布时间】:2015-06-22 10:06:54
【问题描述】:

我是一个有角度的新手。我希望将参数传递给根据这些参数从服务器获取数据的服务。 例如,如果我想传递一个书名字符串,然后在服务中使用它来与请求 url 连接。文档在这个主题中没有清楚地显示,我在其他资源中找不到有用的例子。

假设这是控制器:

app.controller('BookController', ['$scope', '$routeParams', 'books', function($scope, $routeParams, books) {
  // sending params to books service before a successful return 
  books.success(function(data) {
    $scope.book = data[$routeParams.bookId];
  });

这就是服务

app.factory('books', ['$http', function($http) {
    // var url = 'http://...' + ParamFromController + '.json'
    return $http.get(url)
    .success(function(data) {
            return data;
    })
    .error(function(err) {
            return err; 
    });
}]);

那么,我怎样才能将参数发送到“书籍”服务,然后在服务中使用它? 提前非常感谢。

【问题讨论】:

    标签: javascript angularjs service controller params


    【解决方案1】:

    您可以将您的服务声明为:

    app.factory('books', ['$http', function($http) {
        // var url = 'http://...' + ParamFromController + '.json'
        return {
          getVal: function(url,options){
             return $http.get(url,options)
          }
        } 
    }]);
    

    并在您的控制器中使用它并提供适当的参数以传递给“书籍”服务:

    app.controller('BookController', ['$scope', '$routeParams', 'books', function($scope, $routeParams, books) {
      // sending params to books service before a successful return 
      books.getVal('api/activity.json',{'name':'abc'}).success(function(data) {
        $scope.book = data[$routeParams.bookId];
      });
    

    另外,不要在 servicecontroller function 中都使用 .success() 回调。 books 服务正在返回一个承诺($http 隐式返回一个承诺),您可以在控制器中处理它。

    【讨论】:

      【解决方案2】:

      现在,您将 $http 的承诺/结果作为服务实例返回。 服务不应该以这种方式工作。您应该返回一个包含多个定义服务的属性/方法的对象:

      app.factory('books', ['$http', function($http) { 
        var instance = {
          getBook: function(bookId) {  
            return $http.get(...);
          }
        }
      
        return instance;
      }
      

      在控制器中,您可以按如下方式使用图书服务:

      books
        .getBook($routeParams.bookId)
        .then(function (result) { ... });
      

      【讨论】:

        【解决方案3】:
        app.factory('books', ['$http', function($http) {
        
        var booksService = {};
        
        booksService.getBook = function(bookId){
        {
             return $http.get(url, bookId);
        };
        
        return booksService;
        }]);
        

        在你的控制器中

        app.controller('BookController', ['$scope', '$routeParams', 'books', function($scope, $routeParams, books) {
         books.getBook($routeParams.bookId).success(function(data) {
            $scope.book = data;
          });
        

        【讨论】:

          猜你喜欢
          • 2015-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-10
          • 1970-01-01
          相关资源
          最近更新 更多