我应该做以下事情:
$q
(异步)有另一个服务(也是异步),如果它们匹配某个字符串(搜索字段),它应该只返回上述工厂的元素。目的是缩小值,以便有相当少的值,以便我的选择框可以处理它。
$scope
属性以供选择框(指令)进一步使用。我想我应该只在控制器中注入第二个(缩小值)服务/工厂。第一个工厂(大型数据集)应作为依赖项注入第二个服务中,进行比较,从而创建缩小的结果集。
但是,当我使用大型数据集注入工厂时,我不确定我应该如何将其数据分配给变量/对象,以便我可以在第二个工厂中进一步使用它。
如果我console.log
,它会显示为承诺
Object {then: function, catch: function, finally: function}
而不是返回数据集。
首先提到的工厂:
.factory('MedicationDisplayNamesFactory', function MedicationDisplayNamesFactory($http, $q){
return {
getDisplayNames: function(){
return $http({
method: 'GET',
url: 'http://rxnav.nlm.nih.gov/REST/spellingsuggestions?name=ambien',
headers: {
'Content-type': 'application/json'
}
});
}
};
return MedicationDisplayNamesFactory;
})
第二个:
.factory('MedicationMatchingNamesFactory',
['$http', '$q', '$timeout', 'MedicationDisplayNamesFactory',
function MedicationMatchingNamesFactory($http, $q, $timeout, MedicationDisplayNamesFactory){
return {
getMatchingNames: function(){
var foo = MedicationDisplayNamesFactory.getDisplayNames().then(
function(response){
var bar = response.data.suggestionGroup.suggestionList.suggestion;
}
);
console.log(foo);
return foo;
}
};
return MedicationMatchingNamesFactory;
}])
在控制器中,我应该可以打电话:
$scope.myData = MedicationMatchingNamesFactory.getMatchingNames();
像这样。
答案 0 :(得分:1)
我为HTTP响应创建了一个回调函数,并将其作为参数传递给getMatchingNames:
<!doctype html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.js"></script>
</head>
<body ng-app="plunker">
<div ng-controller="MainCtrl">
<ul>
<li ng-repeat="name in myData">
{{name}}
</li>
</ul>
</div>
<script>
var app = angular.module('plunker', []);
app.controller('MainCtrl', ['$scope', 'MedicationMatchingNamesFactory', function($scope, MedicationMatchingNamesFactory) {
var setMyData = function(myData) {
$scope.myData = myData;
}
MedicationMatchingNamesFactory.getMatchingNames(setMyData);
}]).factory('MedicationDisplayNamesFactory', function MedicationDisplayNamesFactory($http, $q){
return {
getDisplayNames: function(){
return $http({
method: 'GET',
url: 'http://rxnav.nlm.nih.gov/REST/spellingsuggestions?name=ambien',
headers: {
'Content-type': 'application/json'
}
});
}
};
return MedicationDisplayNamesFactory;
}).factory('MedicationMatchingNamesFactory',
['$http', '$q', '$timeout', 'MedicationDisplayNamesFactory',
function MedicationMatchingNamesFactory($http, $q, $timeout, MedicationDisplayNamesFactory){
return {
getMatchingNames: function(callback){
MedicationDisplayNamesFactory.getDisplayNames().then(function(response){
var data = response.data.suggestionGroup.suggestionList.suggestion;
callback(data);
});
}
};
}]);
</script>
</body>
</html>
&#13;
答案 1 :(得分:0)
我无法接受提供的答案,因为我没有测试它 - 我简化了两个工厂,最后使用sessionStorage
将一个工厂的结果集保留在内存中,同时缩小了该值。第二
这可能对其他人有用,所以我把它放在这里:
// save the large dataset to sessionStorage
sessionStorage.allNames = angular.toJson(allNames);
// read saved dataset and assign it to a variable
var allNames = angular.fromJson( sessionStorage.allNames );