yarkov
@yarkov
Помог ответ? Отметь решением.

Ссылки на объекты или боль angular-разработчика?

Здравствуйте. Написал сервис-интерсептор, который видоизменяет config.data при обращении к определенному URL. А если быть точнее, то шифрует алгоритмом AES некоторые элементы объекта.
Имеем таблицу, где данные редактируются прямо в ячейках. И после нажатия кнопки "Сохранить" отправляем строку таблицы в виде JSON на сервер. Сервис примерно такой:
/*global angular*/
(function () {
	'use strict';

	angular
		.module('App')
		.factory('httpRequestEncriptAES', ['$q', '$injector', '$log',
												  httpRequestEncriptAES]);

	/**
	 * @name httpRequestEncriptAES
	 */
	function httpRequestEncriptAES($q, $injector, $log) {
		var self = {};
		self.jsonRegexp = /^application\/json;\s*charset=[a-zA-Z0-9\-\_]+/i;
		self.API = $injector.get('API');
		self.Crypto = $injector.get('cryptoFactory');

		self.request = function (config) {
			var m;
			/**
			 * Проверяем, что отправляется и куда.
			 * Если мы отправляем JSON и в URL запроса есть /api/v1/keeper,
			 * то шифруем данные.
			 */
			if((m = self.jsonRegexp.exec(config.headers['Content-Type'])) !== null){
				if(config.url.indexOf(self.API.makeUrl(self.API.URLS.keeper)) == 0){
					$log.debug("httpRequestEncriptAES Encrypt before:", config.data);
					
					/**
					 * Шифруем информацию
					 */
					config.data = self.Crypto.encrypt(config.data);
					
					$log.debug("httpRequestEncriptAES Encrypt after:", config.data);
				}
			}

			return config;
		};

		self.response = function (response) {
			var m;
			if((m = self.jsonRegexp.exec(response.headers()['content-type'])) !== null){
				if(response.config.url.indexOf(self.API.makeUrl(self.API.URLS.keeper)) == 0 && response.data && response.data.docs){
					var response_data = angular.fromJson(response.data);
					$log.debug("httpRequestEncriptAES Decrypt before:", response_data.docs);
					
					// Дешифруем информацию
					response.data.docs = self.Crypto.decrypt(response_data.docs);
					
					$log.debug("httpRequestEncriptAES Decrypt after:", response.data.docs);
				}
			}

			return response;
		};

		return self;
	}

})();

И функция, которая шифрует данные:
self.encrypt = function (objectData) {  <- config.data из request
			for (var key in objectData) {
				if (objectData.hasOwnProperty(key)) {
				    if((self.targetKeys.indexOf(key) > -1)){
						objectData[key] = self.Crypt.AES.encrypt(objectData[key], self.key);
					}
				}
			}
			var encObject = angular.extend({}, objectData);
			return encObject;
		};

Проблема вот в чем. После того, как шифрующая функция отрабатывает, то данные в таблице тоже видоизменяются, а не нужно )) При загрузке страницы данные нормально дешифруются и выводятся в нормальном виде. Но стоит изменить и попробовать сохранить - и трындец. Как быть?
  • Вопрос задан
  • 390 просмотров
Решения вопроса 1
Попробуйте сделать так:
self.encrypt = function (objectData) {  <- config.data из request
  var encObject = {};
  for (var key in objectData) {
    if ( objectData.hasOwnProperty(key) && self.targetKeys.indexOf(key) !== -1) {
       encObject [key] = self.Crypt.AES.encrypt(objectData[key], self.key);
    }
  }
  return encObject;
};
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@frontender
попробуйте записывать результат шифрования в локальную переменную, не перезаписывая текущие данные. вы ведь из config.data выводите данные в шаблоне
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы