我发现自己经常在我的控制器中使用这个结构:
$http({method: 'GET', url: '../ajax/mycallback', cache: false}).
success(function(data) {
$scope.data = data;
});
有没有办法让这个更简洁?特别是,是否有一种“默认成功方法”只将结果存储在范围内?另外,有没有办法将缓存全局设置为false,所以我可以使用$ http.get()?
答案 0 :(得分:1)
您可以执行以下操作:
myApp.config(function($httpProvider){
$httpProvider.defaults.cache = false;
});
至于你的回调,如果这就是你所做的一切,那么匿名功能是最好的选择。否则,您必须在每次http调用时绑定一个泛型函数,并将其传递给上下文。例如:
$http.get(...).success(standardSuccess.bind({$scope:$scope,p:'data'}));
function standardSuccess(data){
this.$scope[this.p] = data;
}
然后你会把它放在一个可注射的地方。但是你可以看到更冗长,更不易阅读。而且速度较慢。
另一个选择是将范围传递给httpConfig本身。并使用拦截器来设置您的属性。 (因为配置是在一个拦截器中收到的。大概就像:
myApp.config(function($httpProvider){
$httpProvider.defaults.cache = false;
$httpProvider.interceptors.push('defaultHttpSetter');
});
myApp.factory('defaultHttpSetter',function($q){
return {
'response': function(response){
response.config.scope[response.config.prop] = response.data;
return $q.when(response);
}
};
});
将使用像..
$http.get('/myurl',{scope:$scope,prop:'data'});
答案 1 :(得分:1)
$http
会返回承诺,因此您可以直接与范围共享返回结果:
$scope.data = $http({method: 'GET', url: '../ajax/mycallback', cache: false})
Angular在模板中自动承诺履行支持。因此,如果您将data
分配给模板,它将在执行时自动触发摘要周期(读取:当$ http成功时它将触发更新)。
但在这种情况下,我建议您使用$resource
代替$http
,并将$resource
创建作为服务封装。
您也可以以同样的方式使用$resource
,因为它具有自然自动承诺履行。 自然声明承诺将被实际值替换(此逻辑包括数组支持!):
$scope.data = MyResourceService(...)
您只需创建工厂函数即可在特定范围内创建闭包:
function cb(scope, scopeObjName) {
return function(data){
scope["scopeObjName"] = data;
// common logic goes here
}
}
并像这样使用它:
$http({method: 'GET', url: '../ajax/mycallback', cache: false})
.success(cb($scope, "data"))
如您所见,答案取决于实际用例,可以进一步改进。
答案 2 :(得分:0)
我对其他答案没有疑问,但以防万一他们过度思考。你可以这样做:
var genericSuccessFunction = function(data) {
$scope.data = data;
}
您可以将结果函数创建为控制器的一部分,并将其另存为控制器局部变量。
然后你只需要将结果函数传递给成功:
$http({method: 'GET', url: '../ajax/mycallback', cache: false}).success(genericSuccessFunction);
根据我的经验,我经常发现自己使用这种方法来实现错误功能,但我不常发现自己能够使用通用的成功函数。