Cách 'tốt nhất' để khai báo một mô-đun
Vì góc nằm trên phạm vi toàn cục và các mô-đun được lưu vào biến của nó, bạn có thể truy cập các mô-đun thông qua angular.module('mymod')
:
// one file
// NOTE: the immediately invoked function expression
// is used to exemplify different files and is not required
(function(){
// declaring the module in one file / anonymous function
// (only pass a second parameter THIS ONE TIME as a redecleration creates bugs
// which are very hard to dedect)
angular.module('mymod', []);
})();
// another file and/or another anonymous function
(function(){
// using the function form of use-strict...
"use strict";
// accessing the module in another.
// this can be done by calling angular.module without the []-brackets
angular.module('mymod')
.controller('myctrl', ['dep1', function(dep1){
//..
}])
// appending another service/controller/filter etc to the same module-call inside the same file
.service('myservice', ['dep2', function(dep2){
//...
}]);
// you can of course use angular.module('mymod') here as well
angular.module('mymod').controller('anothermyctrl', ['dep1', function(dep1){
//..
}])
})();
Không có biến toàn cục nào khác được yêu cầu.
Tất nhiên, tất cả phụ thuộc vào sở thích, nhưng tôi nghĩ đây là loại phương pháp hay nhất, như
- bạn không phải gây ô nhiễm phạm vi toàn cầu
- bạn có thể truy cập các mô-đun của mình ở mọi nơi và sắp xếp chúng cũng như các chức năng của chúng thành các tệp khác nhau theo ý muốn
- bạn có thể sử dụng dạng hàm "sử dụng nghiêm ngặt";
- thứ tự tải các tệp không quan trọng bằng
Các tùy chọn để sắp xếp các mô-đun và tệp của bạn
Cách khai báo và truy cập module này giúp bạn rất linh hoạt. Bạn có thể sắp xếp các mô-đun thông qua kiểu hàm (như được mô tả trong một câu trả lời khác) hoặc qua tuyến đường, ví dụ:
/******** sorting by route **********/
angular.module('home')...
angular.module('another-route')...
angular.module('shared')...
Cuối cùng thì bạn sắp xếp nó như thế nào là vấn đề của sở thích cá nhân và quy mô cũng như loại dự án. Cá nhân tôi muốn nhóm tất cả các tệp của một mô-đun bên trong cùng một thư mục (được sắp xếp thành các thư mục con gồm chỉ thị, bộ điều khiển, dịch vụ và bộ lọc), bao gồm tất cả các tệp thử nghiệm khác nhau, vì nó làm cho mô-đun của bạn có thể tái sử dụng nhiều hơn. Vì vậy, trong các dự án quy mô trung bình, tôi kết thúc với một mô-đun cơ sở, bao gồm tất cả các tuyến cơ bản và bộ điều khiển, dịch vụ, chỉ thị và nhiều mô-đun con phức tạp hơn hoặc ít phức tạp hơn, khi tôi nghĩ chúng cũng có thể hữu ích cho các dự án khác, ví dụ: :
/******** modularizing feature-sets **********/
/controllers
/directives
/filters
/services
/my-map-sub-module
/my-map-sub-module/controllers
/my-map-sub-module/services
app.js
...
angular.module('app', [
'app.directives',
'app.filters',
'app.controllers',
'app.services',
'myMapSubModule'
]);
angular.module('myMapSubModule',[
'myMapSubModule.controllers',
'myMapSubModule.services',
// only if they are specific to the module
'myMapSubModule.directives',
'myMapSubModule.filters'
]);
Đối với các dự án rất lớn, đôi khi tôi kết thúc nhóm các mô-đun theo các tuyến, như đã mô tả ở trên hoặc theo một số tuyến chính được chọn hoặc thậm chí kết hợp các tuyến và một số thành phần đã chọn, nhưng nó thực sự phụ thuộc.
CHỈNH SỬA:
Chỉ vì nó có liên quan và gần đây tôi lại gặp phải vấn đề đó: Hãy cẩn thận để bạn tạo một mô-đun chỉ một lần (bằng cách thêm tham số thứ hai vào hàm angle.module-). Điều này sẽ làm rối ứng dụng của bạn và có thể rất khó phát hiện.
2015 CHỈNH SỬA về phân loại mô-đun:
Một năm rưỡi trải nghiệm góc sau đó, tôi có thể nói thêm rằng những lợi ích từ việc sử dụng các mô-đun được đặt tên khác nhau trong ứng dụng của bạn hơi hạn chế vì AMD vẫn không thực sự hoạt động tốt với Angular và các dịch vụ, chỉ thị và bộ lọc vẫn có sẵn trên toàn cầu bên trong ngữ cảnh góc cạnh ( như được ví dụ ở đây ). Mặc dù vậy, vẫn có một lợi ích về ngữ nghĩa và cấu trúc và nó có thể hữu ích khi có thể bao gồm / loại trừ một mô-đun với một dòng mã duy nhất được nhận xét trong hoặc ngoài.
Nó cũng hầu như không bao giờ có ý nghĩa khi tách các mô-đun con theo loại (ví dụ: 'myMapSubModule.controllers') vì chúng thường phụ thuộc vào nhau.