我如何 return 从我的服务到我的控制器的承诺?
How do I return a promise from my service to my controller?
我问过这是几个变体,但我现在有一些确定的代码,其中包含一个我无法挖掘的错误。
我有这样的 Angular 服务:
.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; }),
]);
};
现在我知道这段代码有几个问题,但我主要专注于尝试 return 服务对我的控制器的承诺。例如,$q 显然对它的承诺没有任何作用,但我向你保证它会在后面的代码中执行。
检查服务中的数据会检索到所需的结果,但是当这滴入控制器时,数据是 [Object object] 而不是这些的数组。
我如何 return 我没有承诺?
这是来自服务的 JSON returned 示例:
这里是 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 对象和 return promise
.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-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>
我问过这是几个变体,但我现在有一些确定的代码,其中包含一个我无法挖掘的错误。
我有这样的 Angular 服务:
.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; }),
]);
};
现在我知道这段代码有几个问题,但我主要专注于尝试 return 服务对我的控制器的承诺。例如,$q 显然对它的承诺没有任何作用,但我向你保证它会在后面的代码中执行。
检查服务中的数据会检索到所需的结果,但是当这滴入控制器时,数据是 [Object object] 而不是这些的数组。
我如何 return 我没有承诺?
这是来自服务的 JSON returned 示例:
这里是 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 对象和 return promise
.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-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>