Подтвердить что ты не робот

Функции записи в сервисах angularjs

Я хочу написать функцию внутри службы angularjs, и я хочу повторно использовать ее во всех моих

контроллеры.

var mod= angular.module('myapp', ['eventFilters', 'highlight', 'event', 'dayfilter', 'Services']).
config(['$routeProvider', function($routeProvider) {
$routeProvider.
      when('/', {templateUrl: 'template.html',   controller: Ctrl}).
      when('/temp', {templateUrl: 'temp.html',   controller: tempCtrl}).
      otherwise({redirectTo: '/invalid'});
}]);
mod.service ('sharedService', function() {
function daysInMonth(month,year) {
    return new Date(year, month+1,0).getDate();
}
});

Я хочу использовать функцию daysInMonth в любом из моих контроллеров. Является ли это возможным? если бы это могло кто-нибудь объяснить мне кратко с некоторыми примерами в скрипке.

Заранее спасибо

4b9b3361

Ответ 1

Если вы хотите, чтобы функция была доступна для всех ваших контроллеров, вы можете рассмотреть возможность определения метода на $rootScope вместо использования службы:

myApp.run(function($rootScope) {
    $rootScope.daysInMonth = function(year, month) {
        return new Date(year, month+1,0).getDate();
    }
});

Затем, благодаря наследованию прототипа видимости, все области вашего контроллера будут иметь доступ к этому методу (без необходимости инъекции зависимостей). Вы можете вызвать его на любом контроллере, например:

function MyCtrl($scope) {
   console.log($scope.daysInMonth(12, 2012));
}​

JavaScript не найдет функцию daysInMonth, определенную в области $scope, поэтому она будет выглядеть в родительской области (в данном случае в корневой области) для этой функции, и она найдет ее.

Ответ 2

Вот скрипка с основным примером того, как вы можете использовать (внедрять) службы в контроллерах.

http://jsfiddle.net/uhmNR/1/

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


//Here is the service Users with its functions and attributes
//You can inject it in any controller, service is a singleton and its data persist between controllers
myApp.factory('Users', function () {

    var userName = "John Doe";

    return {
        getUserName: function () {
             return userName;                   
        },
        setUserName: function (newName) {
            userName = newName;
        }
    }
});

//An Util service with DaysInMonth method   
myApp.factory('Util', function () {

    return {
        daysInMonth: function (month,year) {

            return new Date(year, month+1,0).getDate();
        }
    };

});   

//Here I am injecting the User service andusing its methods   
myApp.controller('MyCtrl', ['$scope', 'Users', 'Util', function ($scope, Users, Util) {

    Users.setUserName('Robin Hood');

    $scope.name = Users.getUserName();

    //Using Util.daysInMonth()
    $scope.date = Util.daysInMonth(12,2012);
}]);

Надеюсь, что это поможет.

Ответ 3

Выставить функцию как услугу, а затем оставить инжектор AngularJS. Вы можете легко установить службу daysInMonth как статическое значение в вашем модуле. См. Это в действии на http://jsfiddle.net/hbulhoes/zdtnw/

var mod = angular.module('myapp', []);

// This is the declaration of the daysInMonth service. It set as
// a value in the module, with the value being the very function
// you want to share among other services and controllers:
mod.value('daysInMonth', function(month, year) {
    return new Date(year, month+1,0).getDate();
});

// And this is an example controller that depends on the daysInMonth function.
function MyController($scope, daysInMonth){
    $scope.DaysInCurrentMonth = daysInMonth(12, 2012);
}

Ответ 4

Вам нужно разоблачить его. Оберните его в обратный блок:

var mod= angular.module('myapp', ['eventFilters', 'highlight', 'event', 'dayfilter', 'Services']).
config(['$routeProvider', function($routeProvider) {
$routeProvider.
  when('/', {templateUrl: 'template.html',   controller: Ctrl}).
  when('/temp', {templateUrl: 'temp.html',   controller: tempCtrl}).
  otherwise({redirectTo: '/invalid'});
}]);
mod.service ('sharedService', function() {
   return {
      daysInMonth: function(month,year) {
         return new Date(year, month+1,0).getDate();
      }
   };
});

Ответ 5

Если вы хотите использовать фактическую Angular Сервис (не factory или поставщик), вам нужно всего лишь создать способ Angular.

mod.service ('sharedService', function() {
  function daysInMonth(month,year) {
    return new Date(year, month+1,0).getDate();
  }
});

// Would turn into 

mod.service("sharedService", function(){
  this.daysInMonth(month, year){
    return new Date(year, month + 1, 0).getDate();
  }
});

Вы не должны RETURN из службы, если только НЕОБХОДИМО не переопределить объект ЭТО по умолчанию, который будет создан, когда служба NEW'ED. В этом случае вы можете вернуть Object Literal, Function Definition, Array, большинство объектов, исключая любые примитивы. Просто заверяйте, что вы задаете вопрос: "Почему мне нужно переопределять поведение по умолчанию?"

Это действительно весь смысл службы. Когда вы введете СЕРВИС Angular, выполните NEW функцию, которую вы передадите, вернув ее вам, как описано. В вашем случае услуга будет именно тем, что вам нужно. Angular будет создавать Сервис только один раз, а новый результат функции sharedService будет доступен по всему вашему приложению, но только тогда, когда служба будет DI'd хотя бы один раз в вашем приложении. Если вы не сделаете DI, то служба никогда не будет создана, поскольку она лениво загружена (Factory и Service).

Если вы действительно хотите что-то вернуть (хотя вы можете сделать это в службе), подходящее место будет в Angular Factory. Фактически, если вы НЕ НЕТ возвратитесь из Factory, вы получите небольшое небольшое уведомление

ОШИБКА: Поставщик 'sharedService' должен возвращать значение из метода $get factory.

ПРИМЕЧАНИЕ:, где функция $get является вторым аргументом определения функции службы.

mod.factory("sharedService", function(){
  function daysInMonth(month, year){
    return new Date(year, month + 1, 0).getDate();
  }

  return {
    daysInMonth: daysInMonth
  }

  // Or you could do this...
  return daysInMonth;
});

При использовании Angular Factory вы больше не получаете функцию NEW'ED, поэтому необходимо создать возврат.

Ответ 6

Я думаю, что OP означает, что служба является функцией, например функцией $timeout. Поскольку служба по умолчанию factory делает "сервис" того, что вы возвращаете, вы можете сделать это:

angular.module('myApp.myModule',[])
.factory('add',['$injectables',function($injectables) {
  return function(arg1,arg2)
  {
    //this is the function that will be called when you use this service
    return arg1 + arg2;
  }
}]);