#angularjs
#angularjs
Вопрос:
У меня есть контроллер и сервис примерно такие:
.controller('BooksCtrl', function($scope, bookService) {
bookService.getBooks().then(function(response) {
$scope.books = response.data;
});
})
.factory('bookService', function($http) {
return {
getBooks: function() {
return $http.get('http://books.com/books').success(function(response) {
return response;
});
}
}
})
Всякий раз, когда я перехожу к маршруту, соответствующему BooksCtrl
, список книг на моем экране становится пустым (во время выполнения GET
вызова), а затем перерисовывается со свежими данными.
Какой хороший способ избежать этого обновления на странице, сохранить существующие данные во время выполнения GET
вызова, а затем просто обновить экран?
Я думал о том, чтобы сохранить все книги в свойстве bookService
, присвоить его $scope.books
в контроллере, а затем обновлять это свойство только после завершения GET
вызова (я бы назвал что-то вроде bookService.updateBooks()
в контроллере). Это разумно или есть более простой / лучший способ?
Комментарии:
1. Происходит ли это поведение «только» всякий раз, когда вы переходите к просмотру, соответствующему ‘BooksCtrl’? Или когда вы находитесь в том же представлении, и вызов службы обновляет данные?
2. Вызов службы выполняется только при запуске контроллера. Пока просмотр / маршрут активен, данные не обновляются.
3. Смотрите, когда вы переходите к новому представлению, все старые данные в предыдущем представлении выходят за рамки. Новый контроллер войдет в область видимости и перезагрузит все данные и создаст представление с нуля.
4. Да, но мне интересно, могу ли я что-то с этим сделать. Передайте в представление кэшированный список книг, пока я, например, извлекаю новый список. Мне интересно, делают ли / как люди это делают.
5. Я думаю о других подходах. В вашем старом представлении отображается список книг, и вам нужно, чтобы ваше новое представление отображало тот же список книг (без повторного рендеринга) и включало что-то еще в это новое представление вместе с книгами… верно? Можете ли вы показать вам HTML-страницы для этого старого и нового представлений? Возможно, здесь может пригодиться ng-include, но я не уверен, пока не попробую.