2015-08-27 2 views
3

Кажется, что угловой автоматически разбивает свойства с префиксом $$, например. $$hashKey, из данных запроса/параметров объектов.

Я хотел бы исключить собственные свойства пользовательского интерфейса, которые я не хочу отправлять на сервер, но, конечно, я не хочу использовать $$.

Предоставляет ли Angular открытый метод фильтрации $$ способом, который я могу использовать для фильтрации моих объектов с помощью другого префикса?

И, где было бы лучшее место для использования этого (или пользовательского) метода? Трансформация? Перехватчик?

Допустим, это мой объект данных:

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

И сохранить его на сервере, как это:

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

Как я мог вырезать _editing имущество до запроса отправляется?

EDIT: Или любое свойство, начиная с _

мне нужно, чтобы это произошло для всех запросов, и нужно будет работать для глубоких, сложных объектов.

Я использую Угловая v1.3.18

Спасибо!

ответ

1

Конечно, использовать $httpProvider.interceptors, но и для отпарной части, вероятно, можно сделать что-то хорошее, используя lodash:

var o = {_f: 1, _b: 2, a: 1, b: 2 } 

_.omit(o, function (value, key) { 
    return key.indexOf('_') === 0; 
}); 

Это возвращает {a: 1, b: 2}.

Но, если вы не хотите использовать внешнюю библиотеку, и только зависит от полезности набора угловых, вы можете сделать:

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

Вы можете только delete Свойства из полезной нагрузки, прежде чем звонить по телефону post.

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

delete payload._editing 

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

Я бы рекомендовал использовать 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); 
     } 
    }; 
}]) 

Вы можете либо получить доступ к объекту конфигурации, либо добавить или удалить свойства из заголовка или отправленного параметра s или сделать перерыв и прочее, или получить доступ ответа и сделать радиопередачу или чего-л зависит от того, что вам нужно

Надеются, что это помогает

+0

Ok спасибо, но вы знаете, если Угловая выставляет свой метод фильтрации, они используют, чтобы стянуть свои свойства '$$'? Было бы здорово, если бы я мог использовать встроенное решение –

+0

, чтобы вы могли просто сказать if (config.data.editing.indexOf ('_')> -1) {делать или не делать что-то неправильно?}, Но встроенный не уверен – stackg91

0

Вы должны использовать перехватчики, чтобы изменить ваш запрос или ответ. Как следует из самого названия, его задачей является перехват HTTP-запроса или ответа.Цитируется угловой documentation:

Для целей глобальной обработки ошибок, аутентификации или любого вида синхронного или асинхронного предварительной обработки запроса или постобработки ответов, то желательно, чтобы иметь возможность перехвата запросов до они передаются серверу и ответы до , они передаются в код приложения, который инициировал эти запросы .

var app = angular.module('myApp', []); 

app.config(['$httpProvider', function($httpProvider) { 
    $httpProvider.interceptors.push('myInterceptor'); 
}]); 

app.factory('myInterceptor', ['$q', function($q) { 

    var myInterceptor = { 
     request: function(config) { 
      delete config.data._editing; 

      return config; 
     } 
    }; 

    return myInterceptor; 
}]); 

app.controller('myController', ['$http', function($http) { 
    var payload = { 
     id: 12345, 
     name: 'Bob', 
     _editing: true 
    }; 

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

Я подготовил рабочий jsfiddle для этого. Скрипка выполняет запрос ajax, поэтому проверьте вкладку сети, чтобы увидеть полезную нагрузку запроса.

Смежные вопросы