2015-05-05 140 views
0

我问过这是几个变化,但我现在有一些明确的代码,包含我无法挖掘的错误。如何将我的服务承诺退还给我的控制器?

我有一个这样的角度服务:

.service("lookupDataService", [ 
     '$q', '$http', '$timeout', function($q, $http, $timeout) { 
    this.brokers = function() { 
     var cachedBrokers = localStorage.getItem("brokers"); 

     if (!cachedBrokers) { 
      return $http.get('/api/brokers') 
       .success(function (data) { 
        localStorage.setItem("brokers", data); 
       }); 
     } else { 
      return $timeout(function() { 
       return { 
        "data": localStorage.getItem("brokers") 
       } 
      }, 1000); 
     } 
    } 
}]) 

,我在我的控制器消费这项服务

$scope.loadData = function() { 
    $scope.promise = $q.all([ 
     lookupDataService.brokers() 
     .then(function(data) { $scope.enquiriesBrokers = data; }), 
    ]); 
}; 

现在我知道有几个问题与此代码,但我主要关注试图从服务中返回对我的控制器的承诺。例如,$ q显然对它的承诺没有任何作用,但我向你保证它会在代码中做到。

检查服务中的数据会检索需求结果,但是当这个流向控制器时,数据是[Object object]而不是这些数组的数组。

当我没有一个时,我该如何回复承诺?

这里是JSON的样品从服务返回:

JSON in Fiddler

这里是HTML的一个样本:

<div class="col-sm-4"> 
    <label for="enquiries-broker">Broker:</label> 
    <select ng-model="equiriesSelectedBroker" class="form-control" ng-options="broker.brokerCodeField for broker in enquiriesBrokers" id="enquiries-broker"> 
     <option value="">Please select a broker</option> 
    </select> 
</div> 
+0

您需要执行'$ scope.enquiriesBrokers = data.data;'在您的工厂控制器的成功方法中 –

+0

谢谢@pankajparkar我已经添加了该代码。 – serlingpa

+0

是否解决了您的问题? –

回答

2

使用$ Q对象并返回承诺

.service("lookupDataService", [ 
    '$q', '$http', '$timeout', function($q, $http, $timeout) { 
this.brokers = function() { 
    var defer = $q.defer() 

    var cachedBrokers = localStorage.getItem("brokers"); 

    if (!cachedBrokers) { 
      $http.get('/api/brokers') 
      .success(function (data) { 
       // defer resolve 
       defer.resolve({data:data}) 
       localStorage.setItem("brokers", angular.toJson(data)); 
      }); 
    } else { 
     // defer resolve 
     defer.resolve({data:angular.fromJson(cachedBrokers) }) 
    } 
    // defer return promise 
    return defer.promise; 
    } 
}]) 

所以,你会总是从服务承诺即使没有$ HTTP调用

编辑:

填充SELECT使用JSON所以ng-model将获得userIdField

broker.userIdField as broker.brokerCodeField for broker in enquiriesBrokers告诉使用broker.userIdField作为值,broker.brokerCodeField作为标签

<select ng-model="equiriesSelectedBroker" class="form-control" 
ng-options="broker.userIdField as broker.brokerCodeField for broker in enquiriesBrokers" id="enquiries-broker"> 
    <option value="">Please select a broker</option> 
</select> 
+0

这看起来不错,谢谢。我的代码正在编译并正在使用缓存。唯一需要承诺的下拉列表未被填充。有任何想法吗?我的控制器消耗没有从上面的代码片段中改变。 – serlingpa

+0

让我从服务器上显示你的JSON,并在HTML中设置下拉菜单 –

+0

我在 – serlingpa

相关问题