Мога ли да имам множество функции в моята AngularJS Factory?

Следвам урока от официалните документи на AngularJS и искам да знам дали мога да добавя друга функция към Phone factory, за да мога да организирам по-добре кода. Те са декларирали функция "query", но какво ще стане, ако искам да добавя функция query2, която препраща към различен url... да речем phones2/: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

Този отговор изглежда е на правилния път, но синтаксисът за всяка фабрична функция не съвпада напълно с горната фабрика.

Нещо от рода на:

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);
     };
}]);

Има дори по-добра версия за това: Референции

function AnotherService () {

  var AnotherService = {};

  AnotherService.someValue = '';

  AnotherService.someMethod = function () {

  };

  return AnotherService;
}
angular
  .module('app')
  .factory('AnotherService', AnotherService);
person Abhijeet    schedule 06.04.2015
comment
Благодаря Abhijeet, харесвам твоя метод;) - 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? Има ли функция, наречена отидете някъде? Или може да се премахне и просто да се използва 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