EDITAR 7/1/15:
Escribí esta respuesta hace bastante tiempo y no he estado siguiendo mucho con angular durante un tiempo, pero parece que esta respuesta sigue siendo relativamente popular, por lo que quería señalar que un par de puntos @nicolas Las marcas a continuación son buenas. Por un lado, inyectar $ rootScope y adjuntar los ayudantes allí evitará que tenga que agregarlos para cada controlador. Además, estoy de acuerdo en que si lo que está agregando debe considerarse como servicios O filtros angulares, deben adoptarse en el código de esa manera.
Además, a partir de la versión actual 1.4.2, Angular expone una API "Proveedor", que se puede inyectar en bloques de configuración. Vea estos recursos para más:
https://docs.angularjs.org/guide/module#module-loading-dependencies
Inyección de valor de dependencia AngularJS dentro de module.config
No creo que vaya a actualizar los bloques de código reales a continuación, porque en estos días no estoy usando activamente Angular y realmente no quiero arriesgarme a una nueva respuesta sin sentirme cómodo de que realmente se ajuste a lo mejor prácticas Si alguien más se siente a gusto, anímate.
EDITAR 2/3/14:
Después de pensar en esto y leer algunas de las otras respuestas, creo que prefiero una variación del método presentado por @Brent Washburne y @Amogh Talpallikar. Especialmente si está buscando utilidades como isNotString () o similar. Una de las ventajas claras aquí es que puede reutilizarlos fuera de su código angular y puede usarlos dentro de su función de configuración (que no puede hacer con los servicios).
Dicho esto, si está buscando una forma genérica de reutilizar lo que deberían ser servicios, la respuesta anterior creo que sigue siendo buena.
Lo que haría ahora es:
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;
});
Luego, en su parcial, puede usar:
<button data-ng-click="console.log(helpers.isNotString('this is a string'))">Log String Test</button>
Antigua respuesta a continuación:
Sería mejor incluirlos como un servicio. Si va a reutilizarlos en varios controladores, incluirlos como servicio evitará que tenga que repetir el código.
Si desea utilizar las funciones de servicio en su html parcial, debe agregarlas al alcance de ese controlador:
$scope.doSomething = ServiceName.functionName;
Luego, en su parcial, puede usar:
<button data-ng-click="doSomething()">Do Something</button>
Aquí hay una manera de mantener todo esto organizado y libre de demasiadas molestias:
Separe su controlador, servicio y código / configuración de enrutamiento en tres archivos: controllers.js, services.js y app.js. El módulo de la capa superior es "app", que tiene las dependencias app.controllers y app.services como dependencias. Entonces app.controllers y app.services pueden declararse como módulos en sus propios archivos. Esta estructura organizativa se acaba de tomar de 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;
});
Luego, en su parcial, puede usar:
<button data-ng-click="genericServices.doSomething()">Do Something</button>
<button data-ng-click="genericServices.doSomethingElse()">Do Something Else</button>
De esa manera, solo agrega una línea de código a cada controlador y puede acceder a cualquiera de las funciones de los servicios donde sea que ese alcance sea accesible.