我创建了一个角度服务,它基本上是另一个服务的包装器,它为json数据提供$ resource请求。这个'包装器服务'执行一些数据格式化,然后将结果返回给我的控制器。
我的问题是我正在努力从我创建的'wrapper'服务中的函数填充我的控制器中的$ scope变量(总是未定义)。我已尝试使用Deferred API,但是如果我在控制器中调用promise.then方法(没有格式化),我只能在控制器中成功获取数据,这会使目的失效。
如何将格式化列表返回给控制器?我写了一个Plunker,下面没有编译,但包含了我想要实现的目标。
答案 0 :(得分:1)
没有能够编译plunkr有点困难,但你能告诉我这是否有效:
factory.js:
routingRulesHelper.factory('ruleSetQueryWrapper', ['$q','RuleSets',
function($q, RuleSets) {
var formatResults = function (ruleSet) {
var aRuleSchedule = {};
//format the payload to correct data ...........
return aRuleSchedule;
};
return {
getRuleSetById: function(ruleSetId){
var deferred = $q.defer();
var ruleset = RuleSets.query({ruleSetId: ruleSetId}, function(ruleSet) {
deferred.resolve(formatResults(ruleSet));
}, function(response) {
//404 or bad
if(response.status === 404) {
console.log("HTTP Error", response.status);
}
deferred.reject();
});
return deferred.promise;
}
}}]);
controller.js:
routingRulesControllers.controller('RulesDisplayCtrl', ['$scope', '$location', '$routeParams', 'RuleSets', 'ruleSetQueryWrapper',
function($scope, $location, $routeParams, RuleSets, ruleSetQueryWrapper) {
$scope.formattedResults = null;
if($routeParams.ruleSetId) {
ruleSetQueryWrapper.getRuleSetById($routeParams.ruleSetId).then(function(results) {
$scope.formattedResults = results;
});
}
}]);
答案 1 :(得分:0)
我相信你应该代替这个
deferred.resolve(ruleSet)
DO
deferred.resolve(formatResults(ruleset))
您也没有在getRuleSetById
服务方法中返回deferred.promise。