Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

Кэширование в AngularJS

#angularjs #кэширование


Доброго времени суток. Столкнулся с такой проблемой с кэшированием. Сначала я проверяю
есть ли данные в кэше, если да, то достаю их оттуда и заношу в scope контроллера, если
нет, то гружу их с сервера. Так вот, если данные уже занесены в кэш и я где-то изменю
данные через ng-model в $scope.players, то они также обновятся и в кэше. Почему так
происходит? Ведь нигде явно не прописано mycache.put("players", newVals)

var mycache = $cacheFactory.get("myCache");
$scope.players = mycache.get("players");

if (!$scope.players) {
    $http.get("test.php").success(function(response) {
        mycache.put("players", response);
        $scope.players = response;
    });
}


И еще вопрос. Можно ли как-нибудь получить доступ к данным в mycache через mycahe.get(),
которые кэшируются неявно, вот таким способом:

var mycache = $cacheFactory.get("myCache");

$http.get("test.php", { cache: mycache }).success(function(response) {
    $scope.players = response;
});

    


Ответы

Ответ 1



Для объяснения, посмотрите на этот jsfiddle В кэше мы сохраним объект response, тот же самый объект, на который $scope.players ссылается. Поэтому, когда обновляем $scope.players, обновляем одновременно то, что в кэше. Функция put из $cacheFactory выглядит вот так: put: function(key, value) { [...] if (!(key in data)) size++; data[key] = value; // <-- Нету копия объекта [...] return value; } Кстати говоря, функция put возвращает value, поэтому можете заменять: mycache.put("players", response); $scope.players = response; со следующим: $scope.players = mycache.put("players", response); Можно ли как-нибудь получить доступ к данным в mycache Если вы хотите узнать всё, что в кэше, есть возможность использовать функцию info(), которая возвращает что-то в этом роде: {"id": "myCache", "size": 1}

Комментариев нет:

Отправить комментарий