Улучшить эту документацию Просмотреть исходный код $interpolate
- $interpolateProvider
- сервис в модуле ng
Обзор
Компилирует строку с разметкой в функцию интерполяции. Этот сервис используется сервисом HTML $compile для привязки данных. См. $interpolateProvider для настройки разметки интерполяции.
var $interpolate = ...; // injected
var exp = $interpolate('Hello {{name | uppercase}}!');
expect(exp({name:'AngularJS'})).toEqual('Hello ANGULARJS!');
$interpolate принимает необязательный четвертый аргумент, allOrNothing. Если allOrNothing равен true, функция интерполяции вернёт undefined, если все вложенные выражения не равны undefined.
var $interpolate = ...; // injected
var context = {greeting: 'Hello', name: undefined };
// default "forgiving" mode
var exp = $interpolate('{{greeting}} {{name}}!');
expect(exp(context)).toEqual('Hello !');
// "allOrNothing" mode
exp = $interpolate('{{greeting}} {{name}}!', false, null, true);
expect(exp(context)).toBeUndefined();
context.name = 'AngularJS';
expect(exp(context)).toEqual('Hello AngularJS!');
allOrNothing полезно для интерполяции URL-адресов. ngSrc и ngSrcset используют это поведение.
Экранированная интерполяция
$interpolate предоставляет механизм для экранирования маркеров интерполяции. Начальные и конечные маркеры можно экранировать, поставив перед каждым их символом обратную косую черту U+005C (обратный слэш). Она будет отображаться как обычный начальный/конечный маркер и не будет интерпретироваться как выражение или привязка.
Это позволяет веб-серверам в некоторой степени предотвращать атаки на основе внедрения сценариев и подмены, а также позволяет работать примерам кода без использования директивы ngNonBindable.
Для обеспечения безопасности настоятельно рекомендуется, чтобы веб-серверы экранировали данные, вводимые пользователем, заменяя угловые скобки (<, >) соответственно на < и >, а все начальные/конечные маркеры интерполяции — на их экранированные аналоги.
Экранированные маркеры интерполяции заменяются фактическими маркерами интерполяции только при обработке текста сервисом $interpolate. Таким образом, для HTML-элементов, интерполированных с помощью $compile, или интерполированных с параметром mustHaveExpression установленным в значение true, интерполированный текст должен содержать неэкранированное выражение интерполяции. Поэтому это обычно полезно только тогда, когда данные пользователя используются для отображения шаблона с сервера или при использовании недоверенных данных директивой.
Известные проблемы
В настоящее время невозможно включить в интерполируемое выражение символ окончания интерполяции. Например, {{ '}}' }} будет неправильно интерпретирован как {{ ' }} + ' }}, то есть интерполированное выражение, состоящее из одиночной кавычки (') и строки ' }}.
Все директивы и компоненты должны использовать стандартные {{ }} символы интерполяции в своих шаблонах. Если вы измените символы интерполяции приложения, сервис $compile попытается перевести стандартные символы в пользовательские. Процесс денормализации недостаточно умён, чтобы не заменять экземпляры стандартных символов там, где они обычно не рассматриваются как символы интерполяции. Например, в следующем фрагменте кода закрывающие фигурные скобки литерального объекта будут неправильно переведены:
<div data-context='{"context":{"id":3,"type":"page"}}">
Решение — убедиться, что такие экземпляры разделены пробелами:
<div data-context='{"context":{"id":3,"type":"page"} }">
См. https://github.com/angular/angular.js/pull/14610#issuecomment-219401099 для получения дополнительной информации.
Зависимости
Использование
$interpolate(text, [mustHaveExpression], [trustedContext], [allOrNothing]);
Аргументы
| Параметр | Тип | Подробности |
|---|---|---|
| text | string | Текст с разметкой для интерполяции. |
| mustHaveExpression (необязательно) | boolean | если установлено в true, то строка интерполяции должна содержать вложенное выражение, чтобы вернуть функцию интерполяции. Строки без вложенных выражений вернут null для функции интерполяции. |
| trustedContext (необязательно) | string | при указании, возвращаемая функция передает интерполированный результат через $sce.getTrusted(interpolatedResult, trustedContext) перед возвратом. См. сервис $sce, предоставляющий строгую контекстную экранизацию, для получения подробностей. |
| allOrNothing (необязательно) | boolean | если |
Возвращает
function(context) |
функция интерполяции, которая используется для вычисления интерполированной строки. Функция имеет следующие параметры:
|
Методы
-
startSymbol();
Символ, обозначающий начало выражения в интерполированной строке. По умолчанию
{{.Используйте
$interpolateProvider.startSymbolдля изменения символа.Возвращает
stringначальный символ.
-
endSymbol();
Символ, обозначающий конец выражения в интерполированной строке. По умолчанию
}}.Используйте
$interpolateProvider.endSymbolдля изменения символа.Возвращает
stringконечный символ.
© 2010–2018 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.7.8/docs/api/ng/service/$interpolate