Могу ли я иметь несколько функций в моей фабрике AngularJS?

Я следую учебнику из официальной документации AngularJS и хочу знать, могу ли я добавить еще одна функция для фабрики телефонов, чтобы я мог лучше организовать код. Они объявили функцию «запрос», но что, если я захочу добавить функцию query2, которая ссылается на другой URL-адрес... скажем, 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}
    });
  }]);

Я пробовал несколько вещей, и ни одна из них не работает: с

Этот ответ кажется правильным, но синтаксис для каждая фабричная функция не совсем соответствует приведенной выше фабрике.

Что-то вроде:

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

person SomethingOn    schedule 17.02.2014    source источник
comment
Можете ли вы привести пример того, что вы пытаетесь?   -  person Chandermani    schedule 17.02.2014
comment
вы можете указать url в методе query2 как: query2 : {method:'GET', url : '/phones2/:phoneName.json', params:{phoneName:'ph1'}, isArray:true}. Но я думаю, что есть более лучший способ сделать это. Этот подход добавляет нежелательные ? в URL. Вы можете посмотреть и прокомментировать это.   -  person Lekhnath    schedule 17.02.2014
comment
Принятый ответ здесь работал: stackoverflow.com/questions/17160771/.   -  person SomethingOn    schedule 17.02.2014


Ответы (3)


Один из таких примеров: Ссылка для демонстрации

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);
person Abhijeet    schedule 06.04.2015
comment
Спасибо, Абхиджит, мне нравится твой метод ;) - person SomethingOn; 09.09.2015
comment
Этот метод намного читабельнее, и поэтому я изменил его на принятый ответ. - person SomethingOn; 09.10.2015
comment
классно! очень полезно - person Hamzeen Hameem; 29.06.2016
comment
@Abhijeet - не могли бы вы или кто-нибудь продемонстрировать, как sort результаты method1Logic (при условии, что есть содержимое $http, ожидающее возврата), чтобы результаты сортировались ДО того, как результаты будут возвращены контроллеру .... или как сортировать результаты экземпляра возвращаются контроллеру. С трудом в этом разбираюсь. - person rolinger; 01.02.2018

Это сервисный код:

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()» для ясности...

person SomethingOn    schedule 21.02.2014
comment
Есть ли причина, по которой вы добавили go ? Есть ли функция с именем go куда-нибудь? Или его можно удалить и просто использовать Auth.Login({etc})? - person brianlmerritt; 09.09.2015
comment
Я проверю @brianlmerritt - person SomethingOn; 14.09.2015

Да, конечно, вы можете иметь несколько функций в объекте. Единственное предостережение: ваш сервис должен возвращать объект. Вы можете иметь все действительные члены javascript в этом объекте, если вы следуете синтаксису object.

Так что возможно следующее

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

Вы должны отсутствовать comma (,) для разделения ключевых значений вашего объекта.

person Kishor Pawar    schedule 29.04.2021