2013-06-05 38 views
18

Hãy nói rằng tôi đã thực hiện một mô-đun với một dịch vụ và một bộ điều khiển trong Angular.js, tôi có thể truy cập vào dịch vụ mà bên trong của bộ điều khiển như vậy:Tên đối số của hàm trong các đối tượng Angular.js kết nối với các đối tượng khác như thế nào?

var myapp = angular.module('my-app', []); 

myapp.factory('Service', function() { 
    var Service = {}; 
    Service.example = 'hello'; 
    //etc.. 
    return Service; 
}); 

myapp.controller('mainController', function($scope, Service) { 
    $scope.greeting= Service.example; 
}); 

Trong ví dụ này, các đối tượng dịch vụ sẽ truyền cho bộ điều khiển, và cơ cấu lại các mã như vậy sẽ không thay đổi hành vi của các mã:

myapp.controller('mainController', function(Service, $scope) { 
    $scope.greeting= Service.example; 
}); 

như vậy, như thế nào Angular.js "biết" những gì các đối số chức năng nghĩa là gì?

+1

Bạn có khá chắc chắn rằng bạn có thể đảo ngược các đối số như vậy? Nó sẽ rất * ngạc nhiên. –

+3

** Wow ** là tài liệu Góc đẹp .... và hoàn toàn không thể điều hướng nếu bạn chưa biết rõ về Góc. Heck, tôi thậm chí không thể tìm thấy hàm đó trong tài liệu API. Tôi có thể tìm thấy một cái gì đó trông mơ hồ như nó [ở đây] (http://docs.angularjs.org/guide/dev_guide.mvc.understanding_controller), nhưng ví dụ là một "lưu ý" và đang chuyển một cái gì đó hoàn toàn khác nhau như đối số thứ hai . –

+0

@ T.J.Crowder - Có ... đó là một chút lộn xộn. Tôi đã sống khá nhiều ở đó trong vài tuần qua và vẫn thấy rằng việc duyệt nguồn trên GitHub dễ dàng hơn. –

Trả lời

21

Góc đơn giản phân tích cú pháp biểu thị toString() của hàm cho tên của các phụ thuộc. Từ the docs:

Trong JavaScript gọi toString() trên một hàm trả về định nghĩa hàm. Định nghĩa sau đó có thể được phân tích cú pháp và các đối số hàm có thể được trích xuất.

Tuy nhiên, lưu ý rằng phương pháp này sẽ không thành công nếu mã của bạn được rút gọn. Vì lý do đó, góc hỗ trợ một sự thay thế (tôi sẽ đề nghị luôn luôn sử dụng nó) cú pháp, sử dụng một mảng:

myapp.controller('mainController', ["$scope", "Service", function($scope, Service) { 
    $scope.greeting= Service.example; 
}]); 
+1

Tất nhiên, đó là phi tiêu chuẩn. 'Hàm # toString' không được định nghĩa ở bất kỳ đâu khi trả về nguồn. Nó hoạt động trên mọi trình duyệt máy tính để bàn mà tôi từng thấy, nhưng ... –

+1

@ T.J.Crowder - Thật vậy, nhưng Angular có bộ kiểm thử toàn diện và 'Function.prototype.toString' hoạt động như mong đợi trong tất cả các trình duyệt được hỗ trợ của nó. Nhưng tôi chỉ sử dụng cú pháp mảng an toàn hơn. –

+0

Bạn có thể giải thích cách bạn liên kết với những gì liên quan đến câu hỏi không? Đừng làm cho tôi sai: Tôi biết những đóng góp của bạn ở đây cũng đủ để biết (về đức tin) rằng họ có liên quan. Nhưng một bình luận giải thích liên kết sẽ giúp mọi người lúng túng trong tài liệu đẹp nhưng khủng khiếp ... :-) –

6

này được thực hiện theo phương pháp khá thông minh annotate (source) mà phải mất một regex quét trên nguồn chữ ký chức năng (sử dụng function.toString()) và lặp lại đẩy từng đối số hàm vào mảng hàm $inject.

Các kết quả tương tự được thực hiện khi tự xác định các mảng $inject như trong:

var MyController = function($scope, myService) { 
    // ... 
} 
// Define function dependencies 
MyController.$inject = ['$scope', 'myCustomService']; 
Các vấn đề liên quan