Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS-从服务调用控制器函数_Angularjs_Angularjs Scope - Fatal编程技术网

AngularJS-从服务调用控制器函数

AngularJS-从服务调用控制器函数,angularjs,angularjs-scope,Angularjs,Angularjs Scope,我对Angular非常生疏,我甚至不确定我是否已经正确地构建了搜索。整个指令和服务术语仍然让我有些困惑,但这不是我的问题 我从头到尾阅读了这一系列优秀的文章: 这就是为什么我现在在我的申请中。为什么我知道我的问题更多地涉及到服务和控制器之间的关系。而不是语法相关的 下面是该应用程序的概述: 我有一个控制器。这将为用户使用对PHP文件的AJAX调用获取一组农场数据,并使用它自己的$scope将其显示在屏幕上 var masterApp = angular.module('masterApp', [

我对Angular非常生疏,我甚至不确定我是否已经正确地构建了搜索。整个指令和服务术语仍然让我有些困惑,但这不是我的问题

我从头到尾阅读了这一系列优秀的文章:

这就是为什么我现在在我的申请中。为什么我知道我的问题更多地涉及到服务和控制器之间的关系。而不是语法相关的

下面是该应用程序的概述:

我有一个控制器。这将为用户使用对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调用获得):

这个很好用。但正如您所看到的,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;
    })
});