AngularJS-从服务调用控制器函数
我对Angular非常生疏,我甚至不确定我是否已经正确地构建了搜索。整个指令和服务术语仍然让我有些困惑,但这不是我的问题 我从头到尾阅读了这一系列优秀的文章: 这就是为什么我现在在我的申请中。为什么我知道我的问题更多地涉及到服务和控制器之间的关系。而不是语法相关的 下面是该应用程序的概述: 我有一个控制器。这将为用户使用对PHP文件的AJAX调用获取一组农场数据,并使用它自己的$scope将其显示在屏幕上AngularJS-从服务调用控制器函数,angularjs,angularjs-scope,Angularjs,Angularjs Scope,我对Angular非常生疏,我甚至不确定我是否已经正确地构建了搜索。整个指令和服务术语仍然让我有些困惑,但这不是我的问题 我从头到尾阅读了这一系列优秀的文章: 这就是为什么我现在在我的申请中。为什么我知道我的问题更多地涉及到服务和控制器之间的关系。而不是语法相关的 下面是该应用程序的概述: 我有一个控制器。这将为用户使用对PHP文件的AJAX调用获取一组农场数据,并使用它自己的$scope将其显示在屏幕上 var masterApp = angular.module('masterApp', [
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调用获得):
这个很好用。但正如您所看到的,farmSelector直接链接到masterCtrl。loadFarmData函数的行为特定于该控制器。换句话说,它将只执行适用于该页面的操作
问题是,这个农场选择器将用于其他页面。每个页面的更改事件的精确行为也会有所不同。所以我正在努力找出这种行为应该发生在哪里。如何调用它取决于使用farmSelector的控制器
我上面链接的文章建议这个farmSelector应该在一个服务中,这样它就可以在其他地方重用。但我仍然对如何在触发事件时为通用服务提供特定的操作感到困惑 我也强烈推荐一项服务,原因与文章建议的相同。它对你的问题也有很好的答案 您需要的技术术语是calback函数。确切地说,这是在触发事件时要采取的特定操作,本文的服务部分提供了一个很好的示例来说明如何执行此操作 请看一下服务文章的这一部分(我已将其精简到重要部分) 现在我们有了一个名为
githubService
的服务,它有一个方法:events
(这实际上只是doRequest
的一个不同名称;我保留了重命名,以便与文章的代码匹配。)
隐藏在幕后的是$q
API,它有时被称为“承诺”API。函数$http
返回一个“promise”对象,这实际上只是代码跟踪“promise”完成时应该发生什么的一种方法。例如,让我们看下一段代码(同样,根据文章的版本进行了修改):
}]))
这就是“魔法”发生的地方。查看对success()
的调用,您将看到它们实际上正在传递一个函数,该函数应该在请求工作时运行。由于关闭,该函数仍然可以访问ServiceController
中的所有变量,因此允许使用$scope
和其他变量。但是,通过每次传递不同的函数,很有可能在每个控制器中编写不同的success()
方法,这允许多个控制器执行不同的操作。当请求完成时,它将调用所给出的每个success
函数
您可以按照这个代码示例获得一个工作模型,但我也建议您看看,也看看这篇关于的文章。你需要了解这两种方法才能真正了解情况,但好消息是,它们在angular中都经常使用,因此值得你花时间。我希望在几个小时的挠头之前看到这个答案。非常感谢你的努力
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;
});
}]);
angular.module('myApp.services', [])
.factory('githubService', ['$http', function($http) {
var doRequest = function(username) {
return $http({
url: 'https://MySuperURL.com/getTheData'
});
}
return {
events: doRequest
};
}]);
app.controller('ServiceController', ['$scope', 'githubService',
function($scope, githubService) {
// uses the $http service to call the GitHub API
// and returns the resulting promise
githubService.events(newUsername)
.success(function(data, status, headers) {
// do magic stuff with the result
// (which is in the data param)
$scope.events = data.data;
})
});