我的服务承诺来自其他服务。我想直接访问数据。
这是我服务的一小部分:
factory('CalculationFactory', function(SizeFromPipe){
var input = {
sizes: function(pipe_id){
var sizesFromPipes = SizeFromPipe.getSizes(pipe_id);
sizesFromPipes.then(function(val){
console.log(val); //Is an object
return val;
});
}
return input;
}).
这是我的“dataservice”:
factory('SizeFromPipe', function($resource, $q){
return {
getSizes: function(pipe_id){
var deffered = $q.defer();
$resource('/api/sizes/fromPipe/:id', {'id':'@id'})
.query({id:pipe_id},
function(sizes){
deffered.resolve(sizes);
},
function(response){
deffered.reject(response);
});
return deffered.promise;
}
};
})
我想从我的控制器那里做到这一点:
$scope.sizes = CalculationFactory.sizes(pipe_id)
我虽然未定义。
有什么想法吗?
更新:添加了数据服务。我知道我可以通过.then ..从控制器访问它。我真的很想保持我的控制器清洁,所以如果可能在我的模型中处理这个问题,那就太棒了。
答案 0 :(得分:0)
警告:这都是未经测试的,我不确定这是最好的解决方案。如果你想要防弹的东西,请等待更专业的人。
虽然你想做正确的事,但你仍然被异步性所迷惑。
可能是这样的:
factory('CalculationFactory', function(PipeCalculation, SizeFromPipe){
var input = {
sizes: function(pipe_id){
return SizeFromPipe.getSizes(pipe_id);
});
},
}).
// in controller
CalculationFactory.input.sizes(pipe_id).then(function(promise){
$scope.sizes = promise;
})
......会有所帮助。
但是,有很多方法可以实现这一目标。看看PipeCalculation的代码也会有所帮助。也许你正在过度思考复杂的事情。
另一种方法是返回新的承诺
factory('CalculationFactory', function(PipeCalculation, SizeFromPipe){
var input = {
sizes: function(pipe_id){
// Assume that $q is available
var defer = $q.defer();
SizeFromPipe.getSizes(pipe_id).then(function(promise){
defer.resolve(promise);
})
return defer.promise;
});
},
}).
答案 1 :(得分:0)
我个人保持资源工厂清洁,而不是在$routeProvider
中使用resolve,并找到了通过$route.current.scope
访问范围变量的方法。所以,在那里分配。
当路由更改其自动从服务器获取响应时,控制器中没有代码。
resolve: {
anyname: function($route, Pipe) {
Pipe.query($route.current.params, function(data) {
$route.current.scope.some_variable = data;
});
}
}
资源
something.factory("Pipe", function($resource) {
return $resource('/api/sizes/fromPipe/:id');
})