РЕДАКТИРОВАТЬ 7/1/15:
Я написал этот ответ довольно давно и не слишком долго следил за углом, но кажется, что этот ответ все еще относительно популярен, поэтому я хотел бы отметить, что пара моментов @nicolas делает ниже хороши. Например, добавление $ rootScope и добавление туда помощников избавит вас от необходимости добавлять их для каждого контроллера. Кроме того - я согласен с тем, что если то, что вы добавляете, следует рассматривать как фильтры ИЛИ Angular, они должны быть включены в код таким образом.
Кроме того, начиная с текущей версии 1.4.2, Angular предоставляет API «Провайдер», который разрешено вставлять в блоки конфигурации. Смотрите эти ресурсы для получения дополнительной информации:
https://docs.angularjs.org/guide/module#module-loading-dependencies
Внедрение зависимости AngularJS в значение внутри module.config
Я не думаю, что я собираюсь обновлять фактические блоки кода ниже, потому что я не очень активно использую Angular в эти дни, и я действительно не хочу рисковать новым ответом, не чувствуя себя комфортно, что это фактически соответствует новым лучшим практики. Если кто-то еще чувствует это, во что бы то ни стало, пойти на это.
РЕДАКТИРОВАТЬ 2/3/14:
Подумав об этом и прочитав некоторые другие ответы, я действительно предпочитаю вариант метода, предложенного @Brent Washburne и @Amogh Talpallikar. Особенно, если вы ищете утилиты, такие как isNotString () или аналогичные. Одно из явных преимуществ заключается в том, что вы можете повторно использовать их вне своего углового кода и использовать их внутри своей функции конфигурации (чего нельзя сделать со службами).
При этом, если вы ищете общий способ повторно использовать то, что должно быть должным образом сервисами, я думаю, что старый ответ все еще хорош.
Что бы я сделал сейчас:
app.js:
var MyNamespace = MyNamespace || {};
MyNamespace.helpers = {
isNotString: function(str) {
return (typeof str !== "string");
}
};
angular.module('app', ['app.controllers', 'app.services']).
config(['$routeProvider', function($routeProvider) {
// Routing stuff here...
}]);
controller.js:
angular.module('app.controllers', []).
controller('firstCtrl', ['$scope', function($scope) {
$scope.helpers = MyNamespace.helpers;
});
Тогда в своей части вы можете использовать:
<button data-ng-click="console.log(helpers.isNotString('this is a string'))">Log String Test</button>
Старый ответ ниже:
Возможно, было бы лучше включить их в качестве службы. Если вы собираетесь повторно использовать их на нескольких контроллерах, включая их в качестве службы, вам не придется повторять код.
Если вы хотите использовать сервисные функции в html-части, то вы должны добавить их в область действия этого контроллера:
$scope.doSomething = ServiceName.functionName;
Тогда в своей части вы можете использовать:
<button data-ng-click="doSomething()">Do Something</button>
Вот способ, которым вы могли бы сохранить все это организованным и без лишних хлопот:
Разделите ваш контроллер, сервис и код маршрутизации / config на три файла: controllers.js, services.js и app.js. Модуль верхнего уровня - это «приложение», в котором зависимости app.controllers и app.services являются зависимостями. Затем app.controllers и app.services могут быть объявлены как модули в своих собственных файлах. Эта организационная структура только что взята из Angular Seed :
app.js:
angular.module('app', ['app.controllers', 'app.services']).
config(['$routeProvider', function($routeProvider) {
// Routing stuff here...
}]);
services.js:
/* Generic Services */
angular.module('app.services', [])
.factory("genericServices", function() {
return {
doSomething: function() {
//Do something here
},
doSomethingElse: function() {
//Do something else here
}
});
controller.js:
angular.module('app.controllers', []).
controller('firstCtrl', ['$scope', 'genericServices', function($scope, genericServices) {
$scope.genericServices = genericServices;
});
Тогда в своей части вы можете использовать:
<button data-ng-click="genericServices.doSomething()">Do Something</button>
<button data-ng-click="genericServices.doSomethingElse()">Do Something Else</button>
Таким образом, вы добавляете только одну строку кода к каждому контроллеру и можете получить доступ к любой из функций служб, где бы ни была доступна эта область.