2015-05-08 2 views
2

Привет В настоящее время я использую службу REST для вывода данных и использования угловых для печати данных в переднем конце.

Проблема, которую я имею, заключается в том, что строка, которая вытягивается, имеет скрытые объекты, такие как & # 39; вместо «апострофа», например. «был вдохновлен Францией & # 39; самый популярный район».
decodeURI, похоже, не работает вообще.
Я нашел обходное решение, создав настраиваемый фильтр, который создает создающий фиктивный элемент, устанавливает внутреннийHTML в фиктивный элемент, а затем принимает его innerHTML после того, как он был разобран и возвращает это значение.Декодирование от JSON до стандартной строки

.filter("decoder", function() { 
    return function(item) { 
    var txt = item; 
    var dummy = document.createElement('p'); 
    dummy.innerHTML = txt; 
    txt = dummy.innerHTML; 
    dummy.remove(); 
    return txt; 
    } 
}) 

Он чувствует себя действительно грязным, поэтому мне было интересно, если бы это был способ избежать манипуляций с DOM для этого.
Спасибо!

+2

Что на самом деле выглядит JSON *? Когда вы говорите «escaped», вы имеете в виду экранированный синтаксис HTML, например ''' или что-то еще? – Pointy

+0

Извините, это похоже на то, что SO декодировало его, когда я его ввел. Я правильно обновил –

+4

Если возможно, исправьте службу, чтобы вернуть * актуальную * информацию: <Использование кодировки HTML/[символов] (http: // ru. wikipedia.org/wiki/Character_encodings_in_HTML) за пределами соответствующего контекста является неправильным. – user2864740

ответ

0

Вы можете использовать ng-bind-html вместо фильтра для его декодирования. Я думаю, что это может помочь вам автоматически декодировать объекты в вашей строке html.

+0

У меня нет доступа для добавления модуля ngSanitize, к сожалению –

+0

Нет, вам не нужно добавлять ngSanitize модуль. Простое использование ng-bind-html. –

3

Вы можете вручную заменить каждый из них.

.filter("decoder", function() { 
    return function (item) { 
    return item 
     .replace(/&#039;/g, "'") 
     .replace(/&quot;/g, '"') 
     .replace(/&amp;/g, "&") 
     .replace(/&lt;/g, "<") 
     .replace(/&gt;/g, ">"); 
    } 
}) 

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

UPDATE

Если вы ищете более полное решение, вы можете сделать следующее:

.filter("decoder", function() { 
    return function (item) { 
    // it would be better to define this globally as opposed to within the function 
    var ENTITIES = { 
     '&amp': '&', 
     '&amp;': '&', 
     '&apos': '\'', 
     '&apos;': '\'', 
     '&gt': '>', 
     '&gt;': '>', 
     '&lt': '<', 
     '&lt;': '<', 
     '&quot': '"', 
     '&quot;': '"' 
    }; 
    return item.replace(/&#?[0-9a-zA-Z]+;?/g, function (entity) { 
     if (entity.charAt(1) === '#') { // if it's a numeric entity 
     var code; 

     if (entity.charAt(2).toLowerCase() === 'x') { // if it's a hex code 
      code = parseInt(entity.substr(3), 16); 
     } else { 
      code = parseInt(entity.substr(2)); 
     } 

     if (isNaN(code) || code < -32768 || code > 65535) { // if it's not a valid numeric entity 
      return ''; 
     } 
     return String.fromCharCode(code); 
     } 
     return ENTITIES[entity] || entity; 
    }); 
    } 
}); 

Как вы можете видеть, это решение значительно сложнее, но это делает охватывают нормальные объекты, а также все числовые. Если ваша цель - избежать обновления в будущем, это ваш лучший выбор.

+0

Это сработает, и я рассмотрел этот вариант. К сожалению, в будущем могут появиться новые права, в которые будут включены добавление и обновление, которые я пытаюсь чтобы избежать. Я ценю ваши усилия, хотя Робин. –

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