Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.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
Javascript 如何从各种角度控制器调用角度服务_Javascript_Angularjs - Fatal编程技术网

Javascript 如何从各种角度控制器调用角度服务

Javascript 如何从各种角度控制器调用角度服务,javascript,angularjs,Javascript,Angularjs,我是angular js的新手,正在试图找到一种在controller中调用以下服务的方法。服务定义如下 app.factory('myappFactory', ['$http', function($http) { var data = {}; data.getmyServiceData = function() { return $http.get('http://..') } return data; }]); 已在一个角度控制器上调用此服务。我想在不同的控

我是angular js的新手,正在试图找到一种在controller中调用以下服务的方法。服务定义如下

app.factory('myappFactory', ['$http', function($http) {

  var data = {};

  data.getmyServiceData = function() {
    return $http.get('http://..')
  }

  return data;
}]);

已在一个角度控制器上调用此服务。我想在不同的控制器中调用它,但不想调用实际的服务,而是使用从上一次调用接收到的数据。我如何对其进行更改,以便在不同的控制器中呼叫工厂?

您可以在服务中使用如下承诺:

app.factory('appFactory',function($http,$q) {
    var data_q = $q.defer();
    var service = {
      getData: getData
    }

    $http.get('http').then(function(response) {
      data_q.resolve(response.data);
    })

    return service;

    function getData() {
      return data_q.promise;
    }
});
app.controller('MyController', ['$scope', 'myappfactory', 
                                                   function($scope, myappfactory) {
    myappfactory().then(function (data) {
        $scope.data = data.data;
    });       
}]);
在控制器中:

app.controller('AppCtrl',function($scope,appFactory) {
  appFactory.getData().then(function(data) {
    $scope.data = data;
  })
})

您只需要将其包含在控制器的依赖项中:

app.controller('MyController', ['$scope', 'myappfactory', 
                                                   function($scope, myappfactory) {
    myappfactory.getmyServiceData().then(function (data) {
        $scope.data = data.data;
    });       
}]);

对于一些改进,您可以考虑让您的工厂返回一个单独的函数,在返回之前将数据解包:

app.factory('myappFactory', ['$http', function($http) {
  return function() {
      return $http.get('http://..', { cache: true }).then(function (data) {
          return data.data;
      };
  };
}]);
然后你可以这样使用它:

app.factory('appFactory',function($http,$q) {
    var data_q = $q.defer();
    var service = {
      getData: getData
    }

    $http.get('http').then(function(response) {
      data_q.resolve(response.data);
    })

    return service;

    function getData() {
      return data_q.promise;
    }
});
app.controller('MyController', ['$scope', 'myappfactory', 
                                                   function($scope, myappfactory) {
    myappfactory().then(function (data) {
        $scope.data = data.data;
    });       
}]);

你能帮我把它传给控制器吗?底部的返回数据如何?该服务中75%的代码是。最好让服务使用者决定何时启动请求,而不是在服务实例化时启动请求。它是如何冗余的?我们的目标是只向服务器发出一个请求,并使用来自多个控制器的数据。请阅读我链接的页面,如果您仍然认为它不是多余的,我将很乐意这样做。事实上,悬念正在折磨我。我现在回答你。这是多余的,因为整个函数体可以在五行中重写:对,但是如果您需要在另一个控制器中使用该服务,您仍然会两次访问该服务。对服务器进行两次调用。JLRishe-如果我尝试从2-3控制器调用工厂,是否会一次又一次地调用服务?@user3620975如果使用缓存,则只会调用一次服务。我已经修改了我的答案以使用cache:true选项。