2016-08-09 16 views
5

Tôi mới đến Angular. Tôi đang nghiên cứu cấu hình khối và chạy khối mô-đun.Sự khác nhau giữa nhà cung cấp và trường hợp trong Góc là gì?

hãy có một cái nhìn vào mã bên dưới:

angular.module('myModule', []). 
config(function(injectables) { // provider-injector 
// This is an example of config block. 
// You can have as many of these as you want. 
// You can only inject Providers (not instances) 
// into config blocks. 
}). 
run(function(injectables) { // instance-injector 
// This is an example of a run block. 
// You can have as many of these as you want. 
// You can only inject instances (not Providers) 
// into run blocks 
}); 

Như bạn có thể thấy trong các khối cấu hình có chép rằng: "Bạn chỉ có thể tiêm các nhà cung cấp (không thể hiện)".

này có nghĩa là gì? Bất cứ ai có thể vui lòng giải thích sự khác biệt giữa nhà cung cấp và trường hợp là gì?

Trả lời

4

Thực ra câu hỏi của bạn là tốt. Để làm cho nó rất đơn giản, chúng tôi xác định các dịch vụ trong Angular JS để đạt được các tính năng của chúng tôi. Nhà cung cấp là một trong những cách để định cấu hình cách dịch vụ đó hoạt động. Có một số khái niệm cụ thể hơn là Giá trị, Hằng số, Nhà máy, Dịch vụ và Trang trí trong Angular JS, có thể giúp chúng tôi chặn các dịch vụ theo các cách khác nhau. Vui lòng kiểm tra liên kết dưới đây.

https://docs.angularjs.org/guide/providers

Trở lại với các nhà cung cấp, chúng được sử dụng để xác định cấu hình rộng ứng dụng mà cần phải được thực hiện ngay cả trước khi bắt đầu ứng dụng. Vì các khối cấu hình được thực hiện trước khi các mô-đun JS được tải, chúng tôi sẽ cấu hình các nhà cung cấp theo chúng. Vì các mô-đun sẽ không được tải bởi thời gian đó bạn không thể truy cập các dịch vụ bên trong một khối cấu hình.

Các khối chạy được thực thi khi tất cả các mô-đun được nạp bởi $ injector. Khi bạn nhập một khối chạy, bạn không được phép định cấu hình nhà cung cấp của mình nữa vì dịch vụ của bạn sẽ vẫn được tải. Đó là lý do bạn không thể truy cập các nhà cung cấp bên trong một khối chạy.

Hãy xem ví dụ. Tôi đã thiết kế ứng dụng của mình để hỗ trợ cả màn hình người dùng và quản trị viên. Nhưng các tính năng liên quan đến chúng được xác định trong các dịch vụ tương ứng của chúng. Tôi chỉ muốn tải các dịch vụ thích hợp khi người dùng đăng nhập. Chúng tôi đạt được điều đó bằng cách sử dụng nhà cung cấp như dưới đây.

Xác định rolesProvider

myApp.provider("roles", function rolesProvider(){ 
var role; 
this.setRole = function(value) { 
role = value; 
} 

this.$get = function rolesFactory() { 
if(role === "user") { 
return new userRole(); 
} else { 
return new adminRole(); 
} 
} 
}); 

Cấu hình rolesProvider như một người dùng

myApp.config(["rolesProvider"], function(rulesProvider){ 
rulesProvider.setRole("user"); 
}); 

Ứng dụng của tôi sẽ được cấu hình để chạy như một người sử dụng chứ không phải là một admin khi ứng dụng đá đi.

Hãy cho tôi biết nếu bạn cần thêm giải thích.

+0

Cảm ơn ... Nó đã giúp tôi hiểu. – RajSharma

+0

Bạn được chào đón. –

0

Bị đánh cắp từ bài đăng này: AngularJS: Service vs provider vs factory - chắc chắn đáng đọc để hiểu rõ hơn vai trò của các loại nhà cung cấp khác nhau có sẵn trong góc.

Nhưng điều gì xảy ra nếu chúng tôi muốn định cấu hình lớp Greeter trước khi tiêm? Sau đó chúng ta có thể viết

Ví dụ:

provide.provider('greeter2', function() { 
    var salutation = 'Hello'; 
    this.setSalutation = function(s) { 
    salutation = s; 
} 

    function Greeter(a) { 
    this.greet = function() { 
     return salutation + ' ' + a; 
    } 
    } 

    this.$get = function(a) { //When injected into a controller or service, this is what will get called. 
    return new Greeter(a); 
    }; 
}); 

Sau đó, bạn có thể cấu hình trên như sau:

angular.module('abc', []).config(function(greeter2Provider) { //Provider injected 
    greeter2Provider.setSalutation('Halo'); 
}); 

function Controller(greeter2) { //Accessing the actual service exposed by the provider.$get 
    expect(greeter2.greet()).toEqual('Halo 123'); 
} 
0

Trả lời nhanh: Nhà cung cấp sẽ tạo một phiên bản. Cho đến khi họ làm bạn có thể sử dụng chúng trong khối config(). Rất hữu ích nói cho một nhà cung cấp dữ liệu mà bạn muốn thay đổi các điểm cuối url trong khi khởi động.

Nhưng bạn có thể chạy một số mã cấu hình trên phần "Nhà cung cấp nhà cung cấp", trước khi new Something() được chạy.

Dịch vụ dịch vụ, Nhà máy dịch vụ và Giá trị dịch vụ đều là các phím tắt của định nghĩa Nhà cung cấp, nhưng ẩn phần cấu hình ra xa bạn và chỉ thẳng đến sự khởi tạo của đối tượng (sử dụng new Something()).

Các vấn đề liên quan