可以更简洁地调用$ http吗?

时间:2014-02-25 14:44:24

标签: angularjs

我发现自己经常在我的控制器中使用这个结构:

$http({method: 'GET', url: '../ajax/mycallback', cache: false}).
success(function(data) {
    $scope.data = data;
});

有没有办法让这个更简洁?特别是,是否有一种“默认成功方法”只将结果存储在范围内?另外,有没有办法将缓存全局设置为false,所以我可以使用$ http.get()?

3 个答案:

答案 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)

选项1:您只需将值传递给$ scope

$http会返回承诺,因此您可以直接与范围共享返回结果:

$scope.data = $http({method: 'GET', url: '../ajax/mycallback', cache: false})

Angular在模板中自动承诺履行支持。因此,如果您将data分配给模板,它将在执行时自动触发摘要周期(读取:当$ http成功时它将触发更新)。

但在这种情况下,我建议您使用$resource代替$http,并将$resource创建作为服务封装。

您也可以以同样的方式使用$resource,因为它具有自然自动承诺履行自然声明承诺将被实际值替换(此逻辑包括数组支持!):

$scope.data = MyResourceService(...)

选项2:您有一个更复杂的回调

您只需创建工厂函数即可在特定范围内创建闭包:

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);

根据我的经验,我经常发现自己使用这种方法来实现错误功能,但我不常发现自己能够使用通用的成功函数。