Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在发送$http请求数据之前对其进行筛选_Javascript_Angularjs_Angularjs Http - Fatal编程技术网

Javascript 在发送$http请求数据之前对其进行筛选

Javascript 在发送$http请求数据之前对其进行筛选,javascript,angularjs,angularjs-http,Javascript,Angularjs,Angularjs Http,它似乎会自动从请求数据/参数对象中剥离以$$为前缀的属性,例如$$hashKey 我想排除我自己不想发送到服务器的仅UI属性,但当然我不想使用$$ Angular是否公开了他们的$过滤方法,我可以用它过滤带有不同前缀的对象? 而且,在哪里使用这种(或自定义)方法是最好的?转变?拦截器 假设这是我的数据对象: var payload = { id: 12345, name: 'Bob', _editing: true }; 我将其保存到服务器,如下所示: $http

它似乎会自动从请求数据/参数对象中剥离以
$$
为前缀的属性,例如
$$hashKey

我想排除我自己不想发送到服务器的仅UI属性,但当然我不想使用
$$

Angular是否公开了他们的
$
过滤方法,我可以用它过滤带有不同前缀的对象?

而且,在哪里使用这种(或自定义)方法是最好的?转变?拦截器

假设这是我的数据对象:

var payload = {
    id: 12345,   
    name: 'Bob',
    _editing: true
};
我将其保存到服务器,如下所示:

$http({
    method: 'POST',
    url: '/save',
    data: payload
});
在发送请求之前,我如何删除
\u编辑
属性

编辑:或任何以
开头的属性

我需要在所有请求中使用它,并且需要在深层复杂对象中使用它

我使用的是Angular v1.3.18


谢谢大家!

在调用
post
之前,只需
删除有效负载中的属性即可

var payload = {
    id: 12345,   
    name: 'Bob',
    _editing: true
};

delete payload._editing

$http({
    method: 'POST',
    url: '/save',
    data: payload
});

我建议使用http拦截器

在您的配置中,您只需将这一行放在app.js中

.config(function ($httpProvider) {
    $httpProvider.interceptors.push('httpInterceptor');
})
我创建了一个这样的工厂

.factory('httpInterceptor', ['$q', '$rootScope', '$filter', function ($q, $rootScope, $filter) {
    var canceller = $q.defer();
    //some vars here
    return {

        request: function (config) {


            //Do some magic here
            //modify the header for example
            config.headers.someHeader = something;
            //or set a timeout if it takes too long
            config.timeout = 20000;

            return config || $q.when(config)
        },

        response: function (response) {

            //handle Response if you want           
            return response || $q.when(response);
        },

        responseError: function (response) {

            //handle error here if you want
            return $q.reject(response);
        }
    };
}])
您可以访问config对象并从标头或发送的参数中添加或删除属性,或者进行超时和填充,或者访问响应并执行广播或smth,具体取决于您需要什么


希望这有帮助

您应该使用拦截器来修改您的请求或响应。顾名思义,它的任务是拦截http请求或响应。引自:

用于全局错误处理、身份验证或任何类型的 请求或请求的同步或异步预处理 在对响应进行后处理时,最好能够拦截 在将请求移交给服务器之前进行请求,并在提交之前进行响应 它们被移交给启动这些应用程序的应用程序代码 请求


我已经为此准备了一份工作。fiddle执行ajax请求,因此请检查网络选项卡以查看请求有效负载。

当然,可以使用
$httpProvider.interceptors
,但是对于剥离部分,您可能可以使用以下方法做些好事:

这将返回
{a:1,b:2}

但是如果您不想使用外部库,而仅仅依赖Angular的实用工具套件,您可以:

angular.forEach(o, function (value, key) { 
  if (key.indexOf('_') === 0) { 
    delete o[key] 
  }
});

好的,谢谢,但是你知道Angular是否公开了他们用来剥离
$$
属性的过滤方法吗?如果我能使用一个内置的解决方案,那就太好了。所以你可以说如果(config.data.editing.indexOf(“”“”)>-1){do或don do smth right?}但是内置的不确定
var o = {_f: 1, _b: 2, a: 1, b: 2 }

_.omit(o, function (value, key) { 
  return key.indexOf('_') === 0; 
});
angular.forEach(o, function (value, key) { 
  if (key.indexOf('_') === 0) { 
    delete o[key] 
  }
});