Угловой отфильтрованный результат не обновляется в пользовательском интерфейсе

0

У меня есть этот фильтр на мгновение:

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, который отслеживает идентификатор. Я предполагаю, что, поскольку ничего в объекте фактически не изменилось (текущее время просто переместилось), этот угловой никогда не обнаруживает ничего для этого объекта.

Все еще не уверен, как обойти это.

Теги:
angular-filters

2 ответа

0

Предполагается, что фильтры являются идемпотентными, то есть один и тот же ввод всегда приводит к одному и тому же выводу. Поскольку 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;
}
  • 0
    Очень верно. Однако я все еще думаю, что angular не переоценивает все объекты в ng-repeat, поскольку ни один из них не изменился. Поскольку он не переоценивается в цикле дайджеста, фильтр не запускается повторно, независимо от состояния.
  • 0
    @lostintranslation Stateful фильтры запускаются как минимум один раз за цикл дайджеста.
0

вы пытались изменить хэш объекта? обычно, если вы измените структуру хеш-кода объекта, будет понимать, что объект модифицирован и визуализирован обновленный объект.

  • 0
    Я мог бы сделать это, но я действительно не хочу менять объект. Это действительно не изменилось. Временная метка на объекте такая же, просто реальное время просто движется вперед. Это означает, что мне нужно прикрепить таймер или что-то к циклу переваривания, чтобы перебрать все мои объекты в коллекции и изменить что-то в хэш или переменную. В этот момент я мог просто создать новую переменную области видимости fromNow и устанавливать ее так часто. Все еще ручной шаг.
  • 0
    есть ли у вас плункер? если возможно, дайте ссылку на пулнер. Это будет лучше для понимания вашей проблемы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню