EDIT 7/1/15:
Tôi đã viết câu trả lời này cách đây khá lâu và đã không theo kịp góc cạnh trong một thời gian, nhưng có vẻ như câu trả lời này vẫn còn tương đối phổ biến, vì vậy tôi muốn chỉ ra rằng một vài điểm của @nicolas làm cho dưới đây là tốt. Đối với một, tiêm $ rootScope và đính kèm các trợ giúp ở đó sẽ giúp bạn không phải thêm chúng cho mọi bộ điều khiển. Ngoài ra - Tôi đồng ý rằng nếu những gì bạn thêm vào nên được coi là bộ lọc HOẶC dịch vụ Angular, thì chúng nên được chấp nhận vào mã theo cách đó.
Ngoài ra, kể từ phiên bản 1.4.2 hiện tại, Angular hiển thị API "Nhà cung cấp", được phép đưa vào các khối cấu hình. Xem các tài nguyên này để biết thêm:
https://docs.angularjs.org/guide/module#module-loading-dependencies
AngularJS tiêm phụ thuộc giá trị bên trong module.config
Tôi không nghĩ rằng tôi sẽ cập nhật các khối mã thực tế bên dưới, bởi vì tôi không thực sự tích cực sử dụng Angular trong những ngày này và tôi không thực sự muốn mạo hiểm một câu trả lời mới mà không cảm thấy thoải mái vì nó thực sự phù hợp với điều tốt nhất mới thực hành. Nếu ai đó cảm thấy như vậy, bằng mọi cách hãy làm điều đó.
EDIT 2/3/14:
Sau khi suy nghĩ về điều này và đọc một số câu trả lời khác, tôi thực sự nghĩ rằng tôi thích một biến thể của phương pháp được đưa ra bởi @Brent Washburne và @Amogh Talpallikar. Đặc biệt nếu bạn đang tìm kiếm các tiện ích như isNotString () hoặc tương tự. Một trong những lợi thế rõ ràng ở đây là bạn có thể sử dụng lại chúng bên ngoài mã góc của bạn và bạn có thể sử dụng chúng bên trong chức năng cấu hình của mình (điều mà bạn không thể làm với các dịch vụ).
Điều đó đang được nói, nếu bạn đang tìm kiếm một cách chung để sử dụng lại những gì nên là dịch vụ, thì câu trả lời cũ tôi nghĩ vẫn là một cách tốt.
Những gì tôi sẽ làm bây giờ là:
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...
}]);
control.js:
angular.module('app.controllers', []).
controller('firstCtrl', ['$scope', function($scope) {
$scope.helpers = MyNamespace.helpers;
});
Sau đó, một phần bạn có thể sử dụng:
<button data-ng-click="console.log(helpers.isNotString('this is a string'))">Log String Test</button>
Câu trả lời cũ dưới đây:
Có thể tốt nhất là bao gồm chúng như một dịch vụ. Nếu bạn sẽ sử dụng lại chúng trên nhiều bộ điều khiển, bao gồm cả chúng như một dịch vụ sẽ giúp bạn không phải lặp lại mã.
Nếu bạn muốn sử dụng các hàm dịch vụ trong phần html của mình, thì bạn nên thêm chúng vào phạm vi của bộ điều khiển đó:
$scope.doSomething = ServiceName.functionName;
Sau đó, một phần bạn có thể sử dụng:
<button data-ng-click="doSomething()">Do Something</button>
Đây là một cách bạn có thể giữ tất cả những thứ này ngăn nắp và không gặp quá nhiều rắc rối:
Tách bộ điều khiển, dịch vụ và mã định tuyến / cấu hình của bạn thành ba tệp: controls.js, services.js và app.js. Mô-đun lớp trên cùng là "ứng dụng", có app.controllers và app.service làm phụ thuộc. Sau đó, app.controllers và app.service có thể được khai báo dưới dạng các mô-đun trong các tệp riêng của chúng. Cơ cấu tổ chức này chỉ được lấy từ 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
}
});
control.js:
angular.module('app.controllers', []).
controller('firstCtrl', ['$scope', 'genericServices', function($scope, genericServices) {
$scope.genericServices = genericServices;
});
Sau đó, một phần bạn có thể sử dụng:
<button data-ng-click="genericServices.doSomething()">Do Something</button>
<button data-ng-click="genericServices.doSomethingElse()">Do Something Else</button>
Bằng cách đó, bạn chỉ thêm một dòng mã cho mỗi bộ điều khiển và có thể truy cập bất kỳ chức năng dịch vụ nào ở bất kỳ phạm vi nào có thể truy cập được.