Как синхронизировать данные с angular-данными
У меня есть угловой проект с угловыми данными для работы с моим Restful API.
моя ситуация выглядит следующим образом:
в моем сервисе я возвращаю defineresource, в моем контроллере я использую service.defineresource.findAll().then
все работает нормально но вот мой вопрос. когда новые данные добавляются на сервер, как мне обновить кеш или добавить новые данные в кеш.
Пожалуйста посоветуй
код: // в service.js
.factory('Service', function(DS) {
DS.defineresource({
name: 'items'
endpoint:'api/v2/users'
});
});
// в controller.js
.controller('MainCtrl', function($scope, Service) {
Service.findAll().then(function (data) {
$scope.items = data
});
});
мой код выше извлекает все данные при первой загрузке, но после начальной загрузки он загружается только из кеша. У меня вопрос, есть ли способ синхронизировать и получать новые данные, не разрушая кеш.
2 ответа
Для принудительного обновления данных из бэкэнда необходимо установить bypassCache: true
в опциях. Если вы не передадите это, то angular-data будет загружаться из кеша. Это задокументировано в документации API.
Для обновления данных каждые 15 минут используйте $timeout
с 900000 миллисекунд. Чтобы иметь кнопку для обновления, используйте функцию объема, которая будет вызываться из ng-click
на кнопке.
.controller('MainCtrl', function($scope, $timeout, Service) {
$scope.refreshData = function () {
Service.findAll({}, { bypassCache: true }).then(function (data) {
$scope.items = data;
});
}
$scope.refreshData();
$timeout($scope.refreshData, 900000);
});
<button ng-click="refreshData()">Refresh</button>
Если вы используете только угловые маршруты, используйте:
$route.reload()
это перезагрузит / обновит вашу страницу. поэтому данные будут синхронизированы. вы можете использовать его в ng-click или проверить в вашем контроллере, когда вводятся новые данные, используйте его
$route.reload()
если вы используете UI-Router, вы можете сделать то же самое, но вместо $route.reload() используйте это:
$state.go($state.current, {}, {reload: true});