Comments 16
Все прекрасно, спору нет, но почему не использовали встроенный $cacheFactory? :)
+1
Да и к тому же, нельзя отдавать как ключ именно объект, т.к. при попытке вытащить из другого объекта (кэша в данном случае) что-то по ключу у этого ключа вызывается метод .toString(), со списком ( [] — список, {} — объект ) все хорошо отрабатывает, т.к. он преобразуется в строку вида «key1,another_key2,one_more_key3», а вот объект вне зависимости от содержимого всегда будет "[object Object]", Lo-Dash не производит каких-то хитрых операций с возвращаемым ключом, пруфлинк. :)
0
Я не стал прибегать к $cacheFactory предвидя следующие проблемы:
В своём проекте я часто использую методы Lo-Dash и в случае с кэшированием не стал экспериментировать с $cacheFactory, использовал проверенное решение. У меня нет опыта по использованию этого сервиса.
Пожалуйста, приведи вариант своей реализации.
- Раздутая логикой функция-фильтр
- Возможные потери производительности относительно memoize
В своём проекте я часто использую методы Lo-Dash и в случае с кэшированием не стал экспериментировать с $cacheFactory, использовал проверенное решение. У меня нет опыта по использованию этого сервиса.
Пожалуйста, приведи вариант своей реализации.
0
Что-то вроде этого:
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;
}
}]);
0
Ежели надо обрезать кол-во отдаваемых элементов, то data = $filter('orderBy')(input, orderBy, reverse||false).slice(0, $s.count); :)
0
Через $scope.$watch() для нужного массива вызывать у кэша .removeAll(). Позже сделаю демку, хотя вроде все и так понятно :)
0
А $scope.$watch() можно засунуть в сам фильтр, чтобы не создавать спагетти код (наверное ты так и хотел). Осталось провести тестирование по скорости работы обоих вариантов и можно писать второй пост :-)
0
Нет, $scope.$watch() нечего делать в фильтре, тот фильтр, что я привел был просто демонстрацией, не более, на деле же сам фильтр не должен рулить кэшированием, все это должно быть в контроллере или сервисе :)
0
Замечательная альтернатива сервису $cacheFactory. Правда, не понятно, что ты хотел сказать опубликовав эту ссылку.
0
я хотел сказать что это пример кеша для ангуляра, а тут заголовок не соответствует содержанию. Применить memoize это не значит: «кешь для ангуляра», по крайней мере в таком виде. Это «ускорение работы фильтров в приложение на ангуляре», «применение memoize в ангуляре», «оптимизируем фильтры в ангуляре», да что угодно, но не то что в заголовке.
0
Мой заголовок — «Кэш для фильтров AngularJS с помощью Lo-Dash». Не представляю при каких условиях ты смог ошибочно интерпретировать его как «кешь для ангуляра» (орфография сохранена).
Хочу уточнить. Правильно ли я понял, что своим не достаточно точным заголовком не оправдал ожиданий и расстроил, потратив твоё время?
Хочу уточнить. Правильно ли я понял, что своим не достаточно точным заголовком не оправдал ожиданий и расстроил, потратив твоё время?
0
А про сокетстрим рассказать? Как? Чего? Хорош?
0
Sign up to leave a comment.
Articles
Change theme settings
Кэш для фильтров AngularJS с помощью Lo-Dash