РЕДАКЦІЯ 7/1/15:
Цю відповідь я написав досить давно, і якийсь час не тримався багато з кутовим, але здається, що ця відповідь все ще відносно популярний, тому я хотів би зазначити, що пара моменту @nicolas робить нижче хороші. Для одного, введення $ rootScope та приєднання помічників утримає вас від необхідності додавати їх до кожного контролера. Крім того - я погоджуюся, що якщо те, що ви додаєте, слід розглядати як фільтри Angular Services АБО фільтри, вони повинні бути прийняті в код таким чином.
Також, з поточної версії 1.4.2, Angular розкриває API "Провайдера", який дозволено вводити в конфігураційні блоки. Докладніше про ці ресурси:
https://docs.angularjs.org/guide/module#module-loading-dependitions
Інжекційна залежність кутової JS значення всередині модуля.config
Я не думаю, що я збираюсь оновлювати фактичні блоки коду нижче, тому що я не дуже активно використовую Angular в наші дні, і я не хочу дуже ризикувати новою відповіддю, не відчуваючи себе комфортно, що вона насправді відповідає новій найкращій практики. Якщо хтось інший відчуває це до цього, будь-ласка, ідіть на це.
EDIT 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>
Ось як ви можете зберегти це все організовано і без зайвих клопотів:
Розділіть свій контролер, сервіс та код / конфігурацію маршрутизації на три файли: controllers.js, services.js та app.js. Модуль верхнього шару - це "додаток", у якому залежно від залежностей залежать програми app.controllers та app.services. Тоді app.controllers та app.services можуть бути оголошені модулями у власних файлах. Ця організаційна структура щойно взята з кутового насіння :
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>
Таким чином, ви додаєте лише один рядок коду до кожного контролера і отримуєте доступ до будь-якої з функцій сервісу, де б доступний цей діапазон.