У меня есть этот фильтр на мгновение:
function momentFilter() {
return function(input, format) {
if (!input) return null;
if (format == 'fromNow') {
var fn = moment(input).fromNow();
console.log('fromNow called with: ' + input + ' giving result: ' + fn);
return fn;
}
};
}
И у меня есть этот html:
<div>{{timestamp | moment: 'fromNow'}}</div>
Я вижу, что фильтр вызывается в цикле дайджеста, и относительное время, которое регистрируется в консоли, выглядит великолепно. IE это идет от 1 минуты назад, 2 минуты назад и т.д. Однако пользовательский интерфейс никогда не обновляет то, что возвращает фильтр.
Первый вызов отражается в пользовательском интерфейсе, но после этого пользовательский интерфейс никогда не обновляется.
Что я делаю не так?
РЕДАКТИРОВАТЬ:
Этот html находится внутри ng-repeat, который отслеживает идентификатор. Я предполагаю, что, поскольку ничего в объекте фактически не изменилось (текущее время просто переместилось), этот угловой никогда не обнаруживает ничего для этого объекта.
Все еще не уверен, как обойти это.
Предполагается, что фильтры являются идемпотентными, то есть один и тот же ввод всегда приводит к одному и тому же выводу. Поскольку timestamp
не изменяется, нет никаких оснований для Углового делать что-либо.
Если ваш фильтр имеет статус stateful, и выход может измениться при каждом вызове, вы должны соответствующим образом пометить его.
function momentFilter() {
function filter(input, format) {
if (!input) return null;
if (format == 'fromNow') {
var fn = moment(input).fromNow();
console.log('fromNow called with: ' + input + ' giving result: ' + fn);
return fn;
}
};
filter.$stateful = true;
return filter;
}
вы пытались изменить хэш объекта? обычно, если вы измените структуру хеш-кода объекта, будет понимать, что объект модифицирован и визуализирован обновленный объект.