Pull to refresh

Comments 16

Все прекрасно, спору нет, но почему не использовали встроенный $cacheFactory? :)
Да и к тому же, нельзя отдавать как ключ именно объект, т.к. при попытке вытащить из другого объекта (кэша в данном случае) что-то по ключу у этого ключа вызывается метод .toString(), со списком ( [] — список, {} — объект ) все хорошо отрабатывает, т.к. он преобразуется в строку вида «key1,another_key2,one_more_key3», а вот объект вне зависимости от содержимого всегда будет "[object Object]", Lo-Dash не производит каких-то хитрых операций с возвращаемым ключом, пруфлинк. :)
Спасибо за ценное дополнение. Исправил.
Я не стал прибегать к $cacheFactory предвидя следующие проблемы:

  1. Раздутая логикой функция-фильтр
  2. Возможные потери производительности относительно memoize

В своём проекте я часто использую методы Lo-Dash и в случае с кэшированием не стал экспериментировать с $cacheFactory, использовал проверенное решение. У меня нет опыта по использованию этого сервиса.

Пожалуйста, приведи вариант своей реализации.
Что-то вроде этого:

angular.module('app')
    .filter('opened', ['$rootScope', '$cacheFactory', '$filter', function ($s, $cacheFactory, $filter) {
      var
        cache = $cacheFactory('openedFilter'),
        keyGen = function () {
          return angular.toJson(arguments);
        };

      return function (input, orderBy, reverse) {
        var
          cacheKey = keyGen(orderBy),
          data = cache.get(cacheKey);

        if (!data) {
          data = $filter('orderBy')(input, orderBy, reverse||false); // Не уверен, поймет ли фильтр undefined :)
          console.log('Применён фильтр «opened»');

          cache.put(cacheKey, data);
        }

        return data;
      }
    }]);

Ежели надо обрезать кол-во отдаваемых элементов, то data = $filter('orderBy')(input, orderBy, reverse||false).slice(0, $s.count); :)
А как ты будешь делать сброс кэша? Форкни мой jsFiddle заменив функцию на фильтр, пожалуйста.
Через $scope.$watch() для нужного массива вызывать у кэша .removeAll(). Позже сделаю демку, хотя вроде все и так понятно :)
А $scope.$watch() можно засунуть в сам фильтр, чтобы не создавать спагетти код (наверное ты так и хотел). Осталось провести тестирование по скорости работы обоих вариантов и можно писать второй пост :-)
Нет, $scope.$watch() нечего делать в фильтре, тот фильтр, что я привел был просто демонстрацией, не более, на деле же сам фильтр не должен рулить кэшированием, все это должно быть в контроллере или сервисе :)
Согласен. Свой вариант я тоже хочу превратить в сервис с полноценным интерфейсом когда появится время. Жду демонстрацию.
Замечательная альтернатива сервису $cacheFactory. Правда, не понятно, что ты хотел сказать опубликовав эту ссылку.
я хотел сказать что это пример кеша для ангуляра, а тут заголовок не соответствует содержанию. Применить memoize это не значит: «кешь для ангуляра», по крайней мере в таком виде. Это «ускорение работы фильтров в приложение на ангуляре», «применение memoize в ангуляре», «оптимизируем фильтры в ангуляре», да что угодно, но не то что в заголовке.
Мой заголовок — «Кэш для фильтров AngularJS с помощью Lo-Dash». Не представляю при каких условиях ты смог ошибочно интерпретировать его как «кешь для ангуляра» (орфография сохранена).

Хочу уточнить. Правильно ли я понял, что своим не достаточно точным заголовком не оправдал ожиданий и расстроил, потратив твоё время?
А про сокетстрим рассказать? Как? Чего? Хорош?
Sign up to leave a comment.

Articles

Change theme settings