【问题标题】:Can I have multiple functions in my AngularJS Factory?我的 AngularJS 工厂可以有多个功能吗?
【发布时间】:2014-02-17 05:03:25
【问题描述】:

我正在关注官方 AngularJS 文档中的Tutorial,我想知道是否可以向电话工厂添加另一个功能,以便更好地组织代码。他们已经声明了一个“查询”函数,但是如果我想添加一个引用不同 url 的 query2 函数……比如说 phone2/:phoneName.json 呢?

工厂声明:

var phonecatServices = angular.module('phonecatServices', ['ngResource']);

phonecatServices.factory('Phone', ['$resource',
  function($resource){
    return $resource('phones/:phoneId.json', {}, {
      query: {method:'GET', params:{phoneId:'phones'}, isArray:true}
    });
  }]);

我尝试了很多东西,但似乎没有一个有效:s

这个answer 似乎在正确的轨道上,但是每个工厂函数的语法与上面的工厂不太匹配。

类似的东西:

phonecatServices.factory('Phone', ['$resource',
      function($resource){
       return {
        query: ...
        query2: ...
       }
      }]);

【问题讨论】:

  • 你能提供一个你正在尝试的例子吗?
  • 您可以在query2 方法中提供url 为:query2 : {method:'GET', url : '/phones2/:phoneName.json', params:{phoneName:'ph1'}, isArray:true}。但我认为有更好的方法来做到这一点。这种方法在URL 中附加不需要的?。您可以对此进行查看和评论。
  • 这里接受的答案有效:stackoverflow.com/questions/17160771/…

标签: angularjs angularjs-factory


【解决方案1】:

这样的一个例子是: Link for Demo

angular.module('services', []).factory('factoryName', ["$filter",
  function($filter) {
    var method1Logic = function(args) {
      //code
    };
    var method2Logic = function(args) {
     //code
    };
    return {
      method1: method1Logic,
      method2: method1Logic
    };
  }
]).controller('MainController', ["$scope", "$rootScope", "$filter", "factoryName", function ($scope, $rootScope, $filter,factoryName) {
     $scope.testMethod1 = function(arg){
       $scope.val1 = factoryName.method1(arg);
     };

     $scope.testMethod2 = function(arg){
       $scope.val2 = factoryName.method2(arg);
     };
}]);

还有更好的版本 意见版本:References

function AnotherService () {

  var AnotherService = {};

  AnotherService.someValue = '';

  AnotherService.someMethod = function () {

  };

  return AnotherService;
}
angular
  .module('app')
  .factory('AnotherService', AnotherService);

【讨论】:

  • 谢谢 Abhijeet,我喜欢你的方法 ;)
  • 此方法可读性更强,因此我将其更改为接受的答案
  • 太棒了!很有用
  • @Abhijeet - 您或其他人能否演示如何 sort method1Logic 的结果(假设有 $http 内容等待返回),以便在结果之前对结果进行排序返回到控制器....或如何对返回到控制器的实例的结果进行排序。很难弄清楚。
【解决方案2】:

这是服务代码:

myServices.factory('Auth', ['$resource',
  function($resource){
    return {
      Login: $resource(serviceURL + 'login', {}, { go: { method:'POST', isArray: false }}),
      Logout: $resource(serviceURL + 'logout', {}, { go: { method:'POST', isArray: false }}),
      Register: $resource(serviceURL + 'register', {}, { go: { method:'POST', isArray: false }}),
    };
  }
]);

我只需从我的控制器中添加 go() 函数调用即可使其工作:

Auth.Login.go({ username: $scope.username, password: $scope.password },

我想我可以在方法之后命名 go 函数,并为清楚起见将其称为“post()”...

【讨论】:

  • 您添加go 有什么原因吗?某处是否有一个名为“go”的函数?还是可以将其删除,只使用Auth.Login({etc})
  • 我会检查@brianlmerritt
【解决方案3】:

是的,当然,您可以在一个对象中拥有多个功能。唯一需要注意的是您的服务应该返回一个对象。只要遵循object 的语法,您就可以在该对象中拥有所有有效的javascript 成员。

所以跟随是可能的

phonecatServices.factory('Phone', ['$resource',
  function($resource){
      return {
            query: ... , // NOTICE THE COMMA HERE 
            query2: ...
       }
}]);

您必须缺少comma (,) 来分隔对象的键值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多