Javascript 我如何将我的服务承诺返还给我的控制员?
我问过这是几个变体,但我现在有一些明确的代码,其中包含一个我无法挖掘的bug 我有一个像这样的角度服务:Javascript 我如何将我的服务承诺返还给我的控制员?,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,我问过这是几个变体,但我现在有一些明确的代码,其中包含一个我无法挖掘的bug 我有一个像这样的角度服务: .service("lookupDataService", [ '$q', '$http', '$timeout', function($q, $http, $timeout) { this.brokers = function() { var cachedBrokers = localStorage.getItem("brokers");
.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显然没有实现它的承诺,但我向您保证它在代码后面会实现
检查服务中的数据会检索期望的结果,但当这些结果流到控制器时,数据是[对象],而不是这些数据的数组
当我没有承诺时,我如何回报承诺
以下是服务返回的JSON示例:
下面是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>
经纪人:
请选择一个经纪人
使用$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调用,您也将始终从服务中获得承诺
编辑:
用JSON填充SELECT
,这样ng模型将获得userIdField
broker.userIdField as broker.brokerCodeField for broker in inquiriesbrokers
告诉我们,使用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>
请选择一个经纪人
您需要执行$scope.inquiriesbrokers=data.data代码>在你的工厂成功控制方法谢谢@pankajparkar我已经添加了该代码。这解决了你的问题吗?不!我的下拉列表中充满了空元素。我认为它正在抓取数据,但可能是本地存储把它搞砸了。这看起来很棒,谢谢。我的代码现在正在编译,正在使用缓存。唯一的问题是请求此承诺的下拉列表没有填充。有什么想法吗?从上面的代码片段来看,我的控制器使用量没有改变。让我展示一下服务器上的JSON,您在HTMLI中的下拉设置已经在上面添加了更多细节。谢谢,我刚刚更新了我的答案,以反映解决方案不要忘记更改controller$scope.inquiriesbrokers=data.data
我们忘记了使用angular.toJson(data)
respangular.fromJson(data)
解析本地存储和本地存储的字符串,请参见上面的更新