MODIFICA 7/1/15:
Ho scritto questa risposta molto tempo fa e non ho tenuto molto al passo con l'angolazione da un po ', ma sembra che questa risposta sia ancora relativamente popolare, quindi ho voluto sottolineare che un paio del punto @nicolas le marche qui sotto sono buone. Per uno, iniettando $ rootScope e collegando gli helper lì ti impedirai di doverli aggiungere per ogni controller. Inoltre, concordo sul fatto che se ciò che si sta aggiungendo dovesse essere considerato come un servizio angolare O un filtro, dovrebbe essere adottato nel codice in quel modo.
Inoltre, a partire dall'attuale versione 1.4.2, Angular espone un'API "Provider", che può essere iniettata in blocchi di configurazione. Vedi queste risorse per ulteriori informazioni:
https://docs.angularjs.org/guide/module#module-loading-dependencies
Iniezione di dipendenza AngularJS del valore all'interno di module.config
Non penso che aggiornerò i blocchi di codice attuali di seguito, perché attualmente non sto usando attivamente Angular e non voglio davvero rischiare una nuova risposta senza sentirmi a mio agio che è effettivamente conforme al nuovo migliore pratiche. Se qualcun altro si sente all'altezza, provaci.
MODIFICA 2/3/14:
Dopo aver riflettuto su questo e aver letto alcune delle altre risposte, in realtà penso di preferire una variante del metodo proposto da @Brent Washburne e @Amogh Talpallikar. Soprattutto se stai cercando utility come isNotString () o simili. Uno dei chiari vantaggi qui è che puoi riutilizzarli al di fuori del tuo codice angolare e puoi usarli all'interno della tua funzione di configurazione (cosa che non puoi fare con i servizi).
Detto questo, se stai cercando un modo generico per riutilizzare quelli che dovrebbero essere correttamente servizi, la vecchia risposta penso che sia ancora buona.
Quello che vorrei fare ora è:
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;
});
Quindi nel tuo parziale puoi usare:
<button data-ng-click="console.log(helpers.isNotString('this is a string'))">Log String Test</button>
Vecchia risposta di seguito:
Potrebbe essere meglio includerli come servizio. Se li riutilizzerai su più controller, inclusi quelli come servizio, ti impedirà di ripetere il codice.
Se desideri utilizzare le funzioni di servizio nel tuo html parziale, dovresti aggiungerle all'ambito di quel controller:
$scope.doSomething = ServiceName.functionName;
Quindi nel tuo parziale puoi usare:
<button data-ng-click="doSomething()">Do Something</button>
Ecco un modo per mantenerlo tutto organizzato e libero da troppe seccature:
Separa il tuo controller, servizio e codice di routing / config in tre file: controllerers.js, services.js e app.js. Il modulo di livello superiore è "app", che ha app.controller e app.services come dipendenze. Quindi app.controllers e app.services possono essere dichiarati come moduli nei propri file. Questa struttura organizzativa è appena presa da 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;
});
Quindi nel tuo parziale puoi usare:
<button data-ng-click="genericServices.doSomething()">Do Something</button>
<button data-ng-click="genericServices.doSomethingElse()">Do Something Else</button>
In questo modo si aggiunge una sola riga di codice a ciascun controller e si è in grado di accedere a qualsiasi funzione dei servizi ovunque tale ambito sia accessibile.