如何正确地将数据从服务传递到控制器

时间:2016-08-13 05:57:41

标签: javascript angularjs angular-promise

我正在尝试将数据从我的http服务发送到我的控制器。该服务正确获取数据,但不会将其发送到控制器。

现在,我知道查询是异步完成的,这就是我尝试使用$ q.defer的原因。 我尝试按照类似问题提供的示例:AngularJS $http call in a Service, return resolved data, not promises,但它仍然不起作用。

这是我的服务:

.service("builds", ['$http', '$q', function($http, $q) {
  var deferred = $q.defer();

  $http({
      method:'GET',
      url: '/builds',
      cache : true
  }).success(function(data) {
      deferred.resolve(data);
  }).error(function(msg){
      deferred.reject(msg);
  });
  console.log(deferred.promise);
  return deferred.promise;}]);

这是我的routeProvider

$routeProvider.
    when('/builds', {
        controller: ['$scope', 'buildsData', function ($scope, buildsData) {
            console.log("In routeprovider:" + buildsData);
            $scope.allBuilds = buildsData;
        }],
      template: '<build-list></build-list>',
      resolve: {
          buildsData: ['builds', function(builds){
              return builds;
          }]
      }
    })

最后这是我的控制器片段:

var app = angular.
 module('buildList').
  component('buildList', {
   templateUrl: 'build-list/build-list.template.html',
    controller: function BuildListController($scope, $window,$location,$cookies, builds) {
     console.log($scope.allBuilds);
     $scope.league = $scope.allBuilds;

2 个答案:

答案 0 :(得分:2)

正如@vishal所说

你应该在服务中创建一个方法,因为一般来说服务可能有很多get和set方法(我的意思是最佳实践)。

创建一个函数说getData

#!/bin/bash

f1done="false"
f2done="false"

function f1 {
    echo "f1: "
    sleep 4
    echo "f1 done."
    f1done="true"
}

function f2 {
    echo "f2: "
    sleep 2
    echo "f2 done."
    f2done="true"
}

f1 &
f2 &

until [[ "$f1done" == "true" && "$f2done" == "true" ]]; do
    echo "$f1done $f2done...";
    sleep 3;
done

echo "Both done."

然后你应该在控制器中调用这个方法

在控制器中,您应该注入此服务,然后

function getData()
{
  $http({
      method:'GET',
      url: '/builds',
      cache : true
  })
}

答案 1 :(得分:0)

你不应该

 controller: ['$scope', 'buildsData', function ($scope, buildsData) {
            console.log("In routeprovider:" + buildsData);
            $scope.allBuilds = buildsData;
        }],

和另一个文件中的控制器:

你可以直接做

 when('/builds', {
        controller: 'BuildListController'
      template: '<build-list></build-list>',
      resolve: {
          buildsData: ['builds', function(builds){
              return builds;
          }]
      }
    })

然后在你的控制器中

$scope.allBuilds = buildsData;

此外,如果你想为它添加一些功能,你的服务应该看起来像这样:

.service("builds", ['$http', '$q', function($http, $q) {

      var deferred = $q.defer();

    getbuilds: function(){
      $http({
          method:'GET',
          url: '/builds',
          cache : true
      }).success(function(data) {
          deferred.resolve(data);
      }).error(function(msg){
          deferred.reject(msg);
      });
      console.log(deferred.promise);
      return deferred.promise;}]);
    }