EDIT 1/7/15:
Eu escrevi essa resposta há muito tempo e não acompanho muito o angular há um tempo, mas parece que essa resposta ainda é relativamente popular, então eu gostaria de salientar que alguns dos pontos @nicolas faz abaixo são bons. Por um lado, injetar $ rootScope e anexar os auxiliares impedirá que você os adicione em todos os controladores. Além disso - concordo que, se o que você está adicionando deve ser considerado como serviços angulares OU filtros, eles devem ser adotados no código dessa maneira.
Além disso, a partir da versão atual 1.4.2, o Angular expõe uma API "Provider", que pode ser injetada em blocos de configuração. Veja estes recursos para mais:
https://docs.angularjs.org/guide/module#module-loading-dependencies
Injeção de valor AngularJS dentro do module.config
Eu não acho que vou atualizar os blocos de código reais abaixo, porque atualmente não estou usando ativamente o Angular e não quero arriscar uma nova resposta sem me sentir confortável por estar realmente em conformidade com o novo melhor práticas. Se alguém quiser, por todos os meios, vá em frente.
EDIT 2/3/14:
Depois de pensar sobre isso e ler algumas das outras respostas, acho que prefiro uma variação do método apresentado por @Brent Washburne e @Amogh Talpallikar. Especialmente se você estiver procurando por utilitários como isNotString () ou similar. Uma das vantagens claras aqui é que você pode reutilizá-las fora do seu código angular e usá-las dentro da sua função de configuração (o que você não pode fazer com os serviços).
Dito isto, se você está procurando uma maneira genérica de reutilizar o que deveria ser adequadamente os serviços, acho que a resposta antiga ainda é boa.
O que eu faria agora é:
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;
});
Então, na sua parcial, você pode usar:
<button data-ng-click="console.log(helpers.isNotString('this is a string'))">Log String Test</button>
Antiga resposta abaixo:
Talvez seja melhor incluí-los como um serviço. Se você for reutilizá-los em vários controladores, incluí-los como um serviço impedirá que você precise repetir o código.
Se você deseja usar as funções de serviço em seu html parcial, adicione-as ao escopo desse controlador:
$scope.doSomething = ServiceName.functionName;
Então, na sua parcial, você pode usar:
<button data-ng-click="doSomething()">Do Something</button>
Aqui está uma maneira de manter tudo organizado e livre de muitos aborrecimentos:
Separe seu controlador, serviço e código / configuração de roteamento em três arquivos: controllers.js, services.js e app.js. O módulo da camada superior é "app", que possui app.controllers e app.services como dependências. Em seguida, app.controllers e app.services podem ser declarados como módulos em seus próprios arquivos. Essa estrutura organizacional foi retirada 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;
});
Então, na sua parcial, você pode usar:
<button data-ng-click="genericServices.doSomething()">Do Something</button>
<button data-ng-click="genericServices.doSomethingElse()">Do Something Else</button>
Dessa forma, você adiciona apenas uma linha de código a cada controlador e pode acessar qualquer uma das funções de serviço sempre que esse escopo estiver acessível.