Tôi rất xanh ở Angular, tôi thậm chí không chắc chắn tôi đã cấu trúc tìm kiếm cho điều này một cách chính xác. Toàn bộ chỉ thị và thuật ngữ dịch vụ vẫn còn làm tôi bối rối, nhưng đó không phải là câu hỏi của tôi.AngularJS - Gọi chức năng điều khiển từ một dịch vụ
Tôi đã đọc loạt bài xuất sắc lĩnh vực này để sao lưu: http://www.ng-newsletter.com/posts/beginner2expert-how_to_start.html
Đó là lý do tại sao tôi đang ở thời điểm này trong ứng dụng của tôi. Và tại sao tôi biết câu hỏi của tôi liên quan nhiều hơn đến mối quan hệ giữa các dịch vụ và bộ điều khiển. Thay vì liên quan đến cú pháp.
Vì vậy, đây là tổng quan về ứng dụng:
Tôi có một bộ điều khiển. Điều này xảy ra và nhận được một loạt dữ liệu trang trại cho người dùng bằng cách sử dụng một cuộc gọi AJAX tới một tệp PHP và hiển thị nó trên màn hình bằng cách sử dụng phạm vi $ của chính nó.
var masterApp = angular.module('masterApp', ['myFilters','commonControls']);
masterApp.controller('MasterCtrl', ['$scope','$http', '$filter', 'commonFarmSelector',
function($scope, $http, $filter, commonFarmSelector){
...
$scope.masterCtrl.loadFarmData = function(farmId) {
var postdata = {
"farmId":farmId
};
$http.post('/service/farmproduction', postdata).success(function (data) {
// Do stuff with the $scope using data
}
}
$scope.masterCtrl.loadFarms();
}
Bạn sẽ thấy tôi đang tiêm một thứ gọi là "commonControls". Đây là một mô-đun tôi tạo ra để giữ các điều khiển sẽ được tái sử dụng bởi nhiều bộ điều khiển. Trong trường hợp này, một trường thả xuống có chứa danh sách các trang trại mà người dùng có quyền truy cập (cũng được gọi bằng AJAX):
var commonControlsApp = angular.module('commonControls', []);
commonControlsApp.controller('farmSelectorCtrl', ['$scope', '$http',function($scope, $http) {
$scope.farmSelectorCtrl ={}
// Change entire farm view when a different farm is selected
$scope.farmSelectorCtrl.switchUserFarm = function() {
var farmId = $scope.farmSelectorCtrl.selectedUserFarm;
$scope.masterCtrl.loadFarms(farmId); // !!! Direct link to masterCtrl
};
// Get a list of the user's farms
$http.post('/service/userfarms').success(function (data) {
$scope.farmSelectorCtrl.userFarms = data.getFarmsPerUserResult.farmIds;
});
}]);
Điều này làm việc tốt. Nhưng như bạn có thể thấy, farmSelector được liên kết trực tiếp với masterCtrl. Và hành vi của hàm loadFarmData đó là cụ thể cho bộ điều khiển đó. Nói cách khác, nó sẽ chỉ làm những điều áp dụng cho trang đó.
Vấn đề là trang trại nàyCông cụ sẽ được sử dụng trên các trang khác. Và hành vi chính xác của sự kiện thay đổi sẽ khác nhau đối với mỗi trang. Vì vậy, tôi đang đấu tranh để làm việc ra nơi mà hành vi này nên ngồi. Và làm thế nào nó sẽ được gọi là phụ thuộc vào bộ điều khiển bằng cách sử dụng farmSelector.
Bài viết tôi đã liên kết ở trên đề xuất trang trại nàyDanh sách phải nằm trong dịch vụ để có thể sử dụng lại ở nơi khác. Nhưng tôi vẫn còn bối rối về cách bạn có thể cung cấp cho một dịch vụ chung một hành động cụ thể để thực hiện khi một sự kiện được kích hoạt.
Tôi ước tôi đã thấy câu trả lời này trước một vài giờ đầu gãi làm thế nào để làm điều đó. Cảm ơn rất nhiều vì nỗ lực –