Создание общих функций контроллера
Как создать какой-то пакет 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');
}
}
});