#javascript #angularjs #interpolation #angular-filters
#javascript #angularjs #интерполяция #угловые фильтры
Вопрос:
Я пишу фильтр для форматирования адресов в одной строке. Объект, который будет передан в фильтр, имеет формат:
{
Line1: "123 Main St.",
Line2: "Apartment 2", // Optional
City: "Chicago",
State: "IL",
Zip: "60623"
}
Пока у меня есть следующее:
angular.module('myApp')
.filter('address', function ($interpolate) {
return function (input, template) {
if (input === null || !angular.isDefined(input)) {
return input;
}
// template is optional. If not provided, use the following
if(!template) {
template = '{{Line1}}, {{Line2 ? Line2 ', ' : ''}}{{City}} {{State}} {{Zip}}';
}
try {
var parsedTemplate = $interpolate(template);
} catch (e) {
console.log(parsedTemplate, template, input, e)
return input;
}
// Compile the template in the context of the input object
return parsedTemplate(input);
};
});
В Angular 1.2 это работает нормально. Однако в Angular 1.0 он завершается ошибкой с ошибкой, Error: Lexer Error: Unexpected next character at columns 6-6 [?] in expression [Line2 ? Line2 ', ' : ''].
я думаю, что Angular 1.0 не поддерживает выражения тернарного оператора $interpolate
, но я не смог найти никакой документации, предполагающей, что поддержка была добавлена в Angular 1.2.
Есть ли способ использовать тернарный оператор в Angular 1.0, и если нет, то как я могу обойти это ограничение?
(Бонусные баллы — где в документации упоминается это изменение или какой коммит в репозитории Angular git внес изменения?)
Комментарии:
1. Я думаю, что нашел фиксацию в другом сообщении StackOverflow, в котором добавлен троичный оператор в Angular 1.1.5 (фиксация 6798fec )
2. Альтернативой использованию троичного оператора является:
someCondition amp;amp; DoTruthy || DoFalsey
3. @Ian Я считаю, что это ответ на вопрос; может быть, вам следует написать это как ответ вместо комментария?
4. Согласно списку изменений , поддержка троичного оператора действительно была добавлена в версии 1.1.5 triangle-squarification (2013-05-22) : » $parse : добавить поддержку троичных операторов в parser ( 6798fec4 )» Итак, это коммит: 6798fec4 .
Ответ №1:
Я понял, что до обновления до 1.1.5 мой обходной путь к использованию троичного оператора в интерполированных выражениях заключался в использовании amp;amp;
и ||
(like someCondition amp;amp; TruthyResult || FalseyResult
) для эффективного получения того же результата. Вот как вы могли бы применить это к своему коду:
template = '{{Line1}}, {{Line2 amp;amp; (Line2 ', ') || ''}}{{City}} {{State}} {{Zip}}';
ДЕМОНСТРАЦИЯ: http://jsfiddle.net/f9n6r /
Единственная проблема с этой настройкой заключается в том, что если TruthyResult
на самом деле не возвращает что-то правдивое, то FalseyResult
будет возвращено amp;amp;
(просто характер использования ||
и, как это, по сравнению с троичным оператором). Однако в вашем коде (Line2 ', ')
никогда не будет falsey из-за ', '
, так что здесь это не будет проблемой. Но в более общем случае это может быть.