Đây là điều mà tôi đã mulling trong khi tạo ra một ứng dụng AngularJS. Khi lần đầu tiên tôi học được về nhà máy AngularJS, tôi nghĩ một cách sử dụng thông minh của họ sẽ được tạo và trả về một hàm constructor chứ không phải là một đối tượng đơn giản, tức là một cái gì đó như:Các mẫu thiết kế AngularJS: Tôi có nên sử dụng các nhà máy để tạo các hàm tạo dựng không?
app.factory("Foo", function() {
function Foo(bar, baz) {
this.bar = bar;
this.baz = baz;
...
}
Foo.prototype = {
constructor: Foo,
method1: function() { ... },
method2: function() { ... },
...,
methodn: function() { ... },
};
return Foo;
});
Sau đó, bạn có thể tiêm các hàm thành của bạn bộ điều khiển và gọi nó với new
. Tôi thấy điều này về mặt thẩm mỹ và OOP-y, nhưng bây giờ tôi bắt đầu nghĩ rằng nó thực sự là một mô hình chống. Vấn đề là nó hoạt động tốt khi bạn đang làm việc trong các ngữ cảnh nhận thức AngularJS, nhưng một khi bạn muốn, ví dụ, gọi hàm khởi tạo từ giao diện điều khiển, sử dụng nó trong một Web Worker, hoặc sử dụng lại mã trong một non- Ứng dụng AngularJS, bạn bắt đầu phải làm việc xung quanh AngularJS hơn là với nó. Tôi bắt đầu tự hỏi, nếu cách tiếp cận này đã được misguided insofar như chức năng trong javascript đã có vẻ là "singletons" và dường như không cần bất kỳ sự giúp đỡ được instantiated.
Tôi có sử dụng sai các nhà máy AngularJS không? Tôi sẽ được phục vụ tốt hơn với các chức năng xây dựng tiếp xúc với phạm vi toàn cầu? Nói chung, có những yếu tố cụ thể thúc đẩy việc sử dụng các nhà máy/dịch vụ/nhà cung cấp AngularJS trên các đối tượng toàn cầu hay ngược lại không?
Thay vì rút ngắn giá trị độ phân giải phụ thuộc được cung cấp bởi vùng chứa Dependency Injection, tôi khuyên bạn nên tìm kiếm tại trang trí mẫu hỗ trợ OOTB bởi $ supply.decorator (...) trong tài liệu góc. Việc đưa ra một mẫu thử nghiệm không phải là 'ác' nhưng khi bạn gọi 'mới' trên một thành phần có các phụ thuộc mà _you_ đang giải quyết, tôi không chắc chắn những gì bạn có được ngoại trừ, có lẽ, các nguyên mẫu có thể cấu hình dựa trên ngữ cảnh. Nếu đó là những gì bạn đang sau, sau đó bạn có thể sử dụng $ inject.get ('myWhatever') để biến nó thành Service Locator. – SonOfNun
Nó không phải là một ý tưởng tốt. Ý tưởng của một nhà máy là cung cấp một giá trị mà không phải lo lắng về cách nó được xây dựng. [Câu trả lời này đưa ra một số giải thích tốt về cách sử dụng các nhà máy, dịch vụ và nhà cung cấp] (http://stackoverflow.com/questions/15666048/angular-js-service-vs-provide-vs-factory). – Bart