我对Angular非常环保,我甚至不确定我是否正在构建一个正确的搜索.整个指令和服务术语仍然让我感到困惑,但这不是我的问题.
我从前到后读过这篇优秀的文章系列:http://www.ng-newsletter.com/posts/beginner2expert-how_to_start.html
这就是为什么我在我的应用程序中的这一点.为什么我知道我的问题更多地涉及服务和控制器之间的关系.而不是语法相关.
所以这里是应用程序的概述:
我有一个控制器.这样就可以使用对PHP文件的AJAX调用为用户获取大量的场数据,并使用它自己的$ scope在屏幕上显示它.
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(); }
你会看到我正在注入一个名为"commonControls"的东西.这是我创建的一个模块,用于保存将由多个控制器重用的控件.在这种情况下,下拉字段包含用户有权访问的服务器场列表(也通过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; }); }]);
这很好用.但正如您所看到的,farmSelector直接链接到masterCtrl.并且该loadFarmData函数的行为特定于该控制器.换句话说,它只会执行适用于该页面的操作.
问题是,这个farmSelector将用于其他页面.并且每个页面的更改事件的精确行为将是不同的.所以我正在努力找出这种行为应该存在的地方.以及如何使用farmSelector将其调用依赖于控制器.
我上面链接的文章表明这个farmSelector应该在一个服务中,所以它可以在别处重用.但我仍然对如何在触发事件时为通用服务提供特定操作感到困惑.