Создание общих функций контроллера

Как создать какой-то пакет utils, который будет доступен из всех моих контроллеров?

У меня есть этот код маршрута в моем основном модуле:

'use strict';

angular.module('lpConnect', []).
    config(['$routeProvider', function($routeProvider) {
    $routeProvider.
        when('/home', {template: 'views/home.html', controller: HomeCtrl}).
        when('/admin', {template: 'views/admin.html', controller: AdminCtrl}).
        when('/connect', {template: 'views/fb_connect.html', controller: MainAppCtrl}).
        otherwise({redirectTo: '/connect'});
}]);

Мне нужна функция, которая может быть общей для HomeCtrl, AdminCtrl и MainAppCtrl.

Как мне это сделать в AngularJS?

Ответ 1

Способ определения общего кода в angular осуществляется через Services.

Вы бы определили новую услугу следующим образом:

.factory('CommonCode', function ($window) {
        var root = {};
        root.show = function(msg){
            $window.alert(msg);
        };
        return root;
    });

В вашем контроллере вы будете вводить эту услугу. Например,

function MainAppCtrl($scope,CommonCode)
{
     $scope.alerter = CommonCode;
     $scope.alerter.show("Hello World");
}

Просто включите CommonCode в качестве аргумента функции контроллера. angular позаботится о том, чтобы ввести его вам (прочитайте об Injection Dependancy.., чтобы понять, что здесь происходит.)

Ответ 2

Чтобы обновить предыдущий ответ (который определяет только factory), существует 3 способа устанавливать зависимости (определить общий код ) в AngularJS:

  • Провайдеры
  • Заводы
  • Услуги

Я не буду говорить о провайдере, потому что это более трудоемкий метод для инъекций зависимостей. Однако эта страница очень хорошо объясняет, как они работают.


Технически сервис и factory используются для одного и того же. Оказывается, служба - это функция конструктора, а factory - нет.

Из этого сообщения:

module.service( 'serviceName', function );

При объявлении serviceName в качестве аргумента для инъекции вы будете снабженный экземпляром функции.

module.factory( 'factoryName', function );

При объявлении factoryName в качестве аргумента для инъекции вы будете с значением, которое возвращается при вызове функцииссылка передана module.factory.


Вы можете использовать тот, который вы предпочитаете, и получить тот же результат.

Вот два кода, выполняющих точно то же самое через service, а затем factory

Синтаксис службы

app.service('MyService', function () {
  this.sayHello = function () {
    console.log('hello');
  };
});

Factory синтаксис

app.factory('MyService', function () {
  return {
    sayHello: function () {
      console.log('hello');
    }
  }
});