2013-05-20 35 views
6

Chỉ cần tiêm tiêm phụ thuộc, và tôi nghĩ tôi bắt đầu hiểu nó.Hiểu sự tiêm phụ thuộc vào bộ điều khiển AngularJS

Vui lòng cho tôi biết nếu tôi đi đúng hướng ...

Ví dụ: Hai thẻ này có tương đương không?

/* injection method */ 
function <controller_name>($scope) {} 
<controller_name>.$inject = ['$scope']; 

/* other method */ 
var app = angular.module('myApp'); 
app.controller(<controller_name>, function($scope) {}); 

Trả lời

12

Đầu tiên một chút làm rõ:

Đối với dependency injection, nó không quan trọng cho dù bạn khai báo một bộ điều khiển sử dụng một chức năng toàn cầu hoặc làm đối số của module.controller(...) phương pháp. Dependency injector chỉ quan tâm đến chính hàm đó. Vì vậy, những gì bạn đang thực sự là hỏi về sự tương đương của hai:

// First 

function MyController($scope) {} 

MyController.$inject = [ '$scope ']; 

// Second 

function($scope) {} 

Và bởi vì cho dù các chức năng điều khiển là vô danh hay không cũng không quan trọng đối với các vòi phun, hai bên trên có thể chỉ là tốt là:

// First 

function MyController($scope) {} 

MyController.$inject = [ '$scope ']; 

// Second 

function MyController($scope) {} 

Bây giờ rõ ràng là sự khác biệt duy nhất giữa hai bộ điều khiển của bạn là sự hiện diện của thuộc tính $inject ở một trong số chúng.

Và đây là câu trả lời thực tế cho câu hỏi của bạn:

Hai bộ điều khiển là gần như giống nhau. Cả hai sẽ nhận được $scope làm đối số và sẽ hoạt động giống nhau. Tuy nhiên, nếu bạn quyết định rút ngắn mã của mình sau, chỉ phiên bản có mảng $inject được đặt trên đó sẽ hoạt động bình thường. Điều này là do nếu bạn không chỉ định mảng $inject hoặc sử dụng phương pháp chú thích nội dòng (http://docs.angularjs.org/guide/di#inlineannotation), cách duy nhất để bộ phát hiện ra những phụ thuộc nào bạn quan tâm là kiểm tra tên của đối số chức năng của bạn ID dịch vụ). Nhưng việc rút gọn sẽ đặt tên cho các đối số đó một cách ngẫu nhiên, do đó loại bỏ cơ hội nhận ra các phụ thuộc theo cách này.

Vì vậy, nếu bạn định giảm thiểu mã của mình, bạn phải chỉ định rõ ràng phụ thuộc sử dụng chú thích mảng hoặc nội tuyến $inject, nếu không, mọi phiên bản sẽ hoạt động tốt.

7

Nếu bạn đang đi để sử dụng phương pháp module.controller, tương đương với ví dụ đầu tiên của bạn sẽ là:

var app = angular.module('myApp'); 
app.controller(<controller_name>, ['$scope', function($scope) {}]); 

ý rằng cách này chúng ta đang đi qua chuỗi $inject cùng với các chức năng, do đó nếu sau đó nó được giảm thiểu nó sẽ vẫn hoạt động.

+0

Cảm ơn nhưng điều đó dường như không hoạt động với '$ http' ... được hỏi về nó ở đây: http://stackoverflow.com/q/16664325 – user2283066

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