AFAIK, нет удобного способа назначить Filter
элементу во время выполнения. Но есть обходное решение, которое может вам пригодиться:
Мы должны определить функцию staticFilter
, которая была бы прокси (оберткой) для звонков на dynamicFilter
. Предполагая, что динамические фильтры экземплярами PolymerExpression
, это могло бы быть объединены следующим образом:
<polymer-element name="my-element" attributes="dynamicFilter">
<template>
<span>{{value | staticFilter(dynamicFilter)}}</span>
</template>
<script>
PolymerExpressions.prototype.uppercase = function(input) {
return input.toUpperCase();
},
PolymerExpressions.prototype.lowercase = function(input) {
return input.toLowerCase();
},
Polymer({
value: '¡Hola!',
dynamicFilter: null,
staticFilter: function(v, df) {
return df ? PolymerExpressions.prototype[df](v) : v;
}
});
</script>
</polymer-element>
<my-element></my-element>
<my-element dynamicFilter='uppercase'></my-element>
<my-element dynamicFilter='lowercase'></my-element>
Теперь вы можете установить атрибут my-element
dynamicFilter
даже во время выполнения.
Причина в том, что filters
скомпилированы и связаны во время инициализации элемента; по соображениям безопасности нет eval
сзади, и поэтому вы не можете просто передать произвольное динамическое значение там. С другой стороны, фильтры готовы принимать параметры, и этот факт действительно делает трюк. Кстати, вы могли бы даже передать экземпляр функции там, если вы не удовлетворены PolymerExpression
с для этой цели.
Этот подход не будет работать, как только вам нужно передать любые данные, связанные с шаблоном, в фильтр. Тем не менее, этот фильтр предназначен для использования внутри 'template repeat' или подобного. – mudasobwa