Ответ 1
EDIT 7/1/15:
Я написал этот ответ довольно давно и не слишком много поддерживал с angular, но кажется, что этот ответ по-прежнему относительно популярен, поэтому я хотел указать, что пара из пункта @nicolas делает ниже, хороши. Например, при вводе $rootScope и прикреплении помощников вам не придется добавлять их для каждого контроллера. Кроме того, я согласен, что если то, что вы добавляете, следует рассматривать как angular services OR filters, они должны быть приняты в код таким образом.
Кроме того, начиная с текущей версии 1.4.2, angular предоставляет API-интерфейс "Provider", который разрешается вводить в блоки конфигурации. Подробнее см. В этих ресурсах:
https://docs.angularjs.org/guide/module#module-loading-dependencies
Угловая зависимость значения внутри модуля module.config
Я не думаю, что я собираюсь обновить фактические блоки кода ниже, потому что я не очень активно использую angular в эти дни, и я действительно не хочу подвергать опасности новый ответ, не чувствуя себя комфортно, фактически соответствуя новым передовым методам. Если кто-то чувствует это, непременно пойдет на это.
РЕДАКТИРОВАТЬ 2/3/14:
Подумав об этом и прочитав некоторые другие ответы, я действительно думаю, что предпочитаю вариацию метода, поднятого @Brent Washburne и @Amogh Talpallikar. Особенно, если вы ищете утилиты, такие как isNotString() или аналогичные. Одно из очевидных преимуществ здесь заключается в том, что вы можете повторно использовать их вне своего кода angular, и вы можете использовать их внутри своей конфигурации (что вы не можете делать с сервисами).
Если говорить о том, что вы ищете общий способ повторного использования того, что должно быть надлежащим образом, то старый ответ, который, как мне кажется, по-прежнему остается хорошим.
Теперь я бы сделал следующее:
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>
Здесь вы можете сохранить все это организованным и свободным от слишком много хлопот:
Разделите свой контроллер, службу и код маршрутизации/конфигурации на три файла: controllers.js, services.js и app.js. Модуль верхнего уровня - это "приложение", в котором есть приложения и приложения. В качестве зависимостей. Затем 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>
Таким образом, вы добавляете только одну строку кода для каждого контроллера и можете обращаться к любой из функций служб, где доступна эта область.