当前位置: 首页 > 面试题库 >

将Angular HTTP.get函数转换为服务

咸臻
2023-03-14
问题内容

我正在尝试将Angular HTTP.get函数转换controllers.js为中的服务services.js

我发现所有示例在实现服务时都存在冲突的方式,它们对名称的选择令人困惑。此外,服务的实际角度文档使用的语法与所有示例都不同。我知道这非常简单,但请在这里帮助我。

我有app.jscontrollers.jsservices.jsfilters.js

app.js

angular.module('MyApp', []).
    config(['$routeProvider', function($routeProvider)
        {
            $routeProvider.
                when('/bookslist', {templateUrl: 'partials/bookslist.html', controller:             BooksListCtrl}).
                otherwise({redirectTo: '/bookslist'});
        }
    ]);

controllers.js

function BooksListCtrl($scope,$http) {
    $http.get('books.php?action=query').success(function(data) {
        $scope.books = data;
    });

    $scope.orderProp = 'author';
}

问题答案:

考虑模块和依赖注入。

因此,假设您有这三个文件

<script src="controllers.js"></script>
<script src="services.js"></script>
<script src="app.js"></script>

您将需要三个模块

1.主应用模块

angular.module('MyApp', ['controllers', 'services'])
  .config(['$routeProvider', function($routeProvider){
    $routeProvider
      .when('/bookslist', {
        templateUrl: 'partials/bookslist.html', 
        controller:  "BooksListCtrl"
      })
      .otherwise({redirectTo: '/bookslist'});
  }]);

请注意,其他两个模块被注入到主模块中,因此它们的组件可用于整个应用程序。

2.控制器模块

当前,您的控制器是全局函数,您可能需要将其添加到控制器模块中

angular.module('controllers',[])
  .controller('BooksListCtrl', ['$scope', 'Books', function($scope, Books){
    Books.get(function(data){
      $scope.books = data;
    });

    $scope.orderProp = 'author';
  }]);

Books传递给控制器​​功能,并由注入到 应用程序模块中的服务模块提供。

3.服务模块

在这里定义Books服务。

angular.module('services', [])
  .factory('Books', ['$http', function($http){
    return{
      get: function(callback){
          $http.get('books.json').success(function(data) {
          // prepare data here
          callback(data);
        });
      }
    };
  }]);

注册服务有多种方式。

  • service :传递了一个构造函数(我们可以称其为类)并返回该类的实例。
  • provider :最灵活和可配置的,因为它使您可以在实例化服务时访问注入器调用的功能
  • factory :在实例化服务时传递给注入器调用的函数。

我偏爱使用factory函数,只是让它返回一个对象。在上面的示例中,我们只返回一个对象,该对象具有get传递成功回调的函数。您也可以更改它以通过错误函数。

编辑 注释中回答@yair的请求,这是将服务注入指令的方式。

我遵循通常的模式,首先添加js文件

<script src="directives.js"></script>

然后定义一个新模块并注册内容,在这种情况下为指令

angular.module('directives',[])
  .directive('dir', ['Books', function(Books){
    return{
      restrict: 'E',
      template: "dir directive, service: {{name}}",
      link:function(scope, element, attrs){
        scope.name = Books.name;
      }
    };
  }]);

注入 指令 模块到 主模块app.js

angular.module('MyApp', ['controllers', 'services', 'directives'])

您可能需要采用其他策略,然后将模块注入 指令模块

请注意,几乎所有内容的语法 内联依赖项注释 都是相同的。该指令被注入相同的Books服务。

更新后的Plunker :http :
//plnkr.co/edit/mveUM6YJNKIQTbIpJHco?p=preview



 类似资料:
  • 我试图将我的Javascript撰写函数翻译成Python,但我对最后一个有问题。我如何推广未知数量的函数? 读完本文后,我想避免使用方法。 javascript: 蟒蛇: 感谢所有的改进。。。

  • 问题内容: 是否每个递归函数都有一个等效的for循环?(两者都达到相同的结果)。 我有这个递归函数: 假设单词是Set [],并且单词[i] =单词长度为i的集合。 我想做的是:使用一个单词(例如,“ stackoverflow”,没有空格)启动递归,我试图查找该单词是否可以切成子单词(“ stack”,“ over”,“ flow”) ..子词的最小长度为3,并且假设长度为i的子词在Set wo

  • 问题内容: 如何获取包含Python中当前正在执行的函数的变量?我不需要函数的名称。我知道我可以用来获取当前的函数名称。我想要实际的可调用对象。是否可以不使用检索函数名称,然后输入名称以获取可调用对象而完成此操作? 编辑: 我有这样做的理由,但它甚至不是一个很好的选择。我正在使用plac解析命令行参数。您可以通过使用来使用它,它会根据“ main”的函数签名生成一个ArgumentParser对象

  • 问题 你有一个除 __init__() 方法外只定义了一个方法的类。为了简化代码,你想将它转换成一个函数。 解决方案 大多数情况下,可以使用闭包来将单个方法的类转换成函数。 举个例子,下面示例中的类允许使用者根据某个模板方案来获取到URL链接地址。 from urllib.request import urlopen class UrlTemplate: def __init__(sel

  • 问题内容: 在Python中,如何将列表转换为? 我需要知道,因为功能 希望将几个time_series对象作为传递,而我有一个timeseries对象列表。 问题答案: 您可以在迭代器之前使用运算符,以在函数调用中对其进行扩展。例如: (请注意之前) 从python文档中: 如果语法* expression出现在函数调用中,则表达式必须求值为可迭代。来自此迭代器的元素被视为附加的位置参数。如果存

  • 我有程序: 我的问题是,如何从第一个查询中获取ID并在第二个查询中使用它们,或者我可以通过某种方式声明变量并从第一个查询中选择到这个变量ID中,然后在第二个查询中使用这个变量?我的任务找不到解决方法...请帮帮我