AngularJS中增删改操作后如何刷新列表?
解决AngularJS增删改后无需刷新页面更新列表的问题
我明白你的困扰——现在每次操作后都得刷新整个页面才能看到数据库的变化,这体验确实不太好。咱们可以通过几个简单的调整,让列表自动更新,不用重载页面。
首先得指出你现有代码里的一个小坑:你把获取列表的方法和存储列表数据的变量都命名成了allFilm,第一次调用方法后,这个变量会被覆盖成返回的数据数组,之后再点击按钮调用cf.allFilm()就会报错,因为它已经不是函数了!所以第一步要把方法和数据变量分开。
步骤1:重构Controller代码
修改你的控制器,把方法和数据变量拆分,同时完善编辑、删除函数,在操作成功后触发列表更新:
angular.module('myApp').controller('controllerFilm', function(service , $scope ) { var vm = this; // 单独用变量存储电影列表数据 vm.films = []; // 获取所有电影的方法(和数据变量名区分开) vm.getAllFilms = function() { service.allFilm().then( function(data){//success vm.films = data; // 更新列表数据,AngularJS会自动同步视图 }, function(err){//error console.log("errore di chiamata allFilm"); } ); }; // 页面加载时自动初始化列表 vm.getAllFilms(); // 删除电影函数 vm.deleteFilm = function(film) { service.deleteFilm(film.filmId).then( function() { // 删除成功后,要么重新获取列表,要么直接从本地数组移除元素 // 方式1:重新获取(简单直接,确保和数据库完全一致) vm.getAllFilms(); // 方式2:直接修改本地数组(减少一次HTTP请求,效率更高) // const filmIndex = vm.films.findIndex(f => f.filmId === film.filmId); // if(filmIndex !== -1) vm.films.splice(filmIndex, 1); }, function(err) { console.log("Errore durante l'eliminazione:", err); } ); }; // 编辑电影函数 vm.editFilm = function(film) { // 假设你有编辑表单/模态框,提交后调用service的编辑接口 service.editFilm(film).then( function() { // 编辑成功后更新列表 vm.getAllFilms(); // 如果是在当前页面直接修改film对象,AngularJS双向绑定会自动更新视图 // 但重新获取列表能确保数据和数据库完全同步 }, function(err) { console.log("Errore durante l'aggiornamento:", err); } ); }; });
步骤2:更新HTML模板
把模板里的cf.allFilm改成cf.films,同时更新按钮的点击事件:
<div ng-controller="controllerFilm as cf"> <button class="button" ng-click="cf.getAllFilms()">FILM MANAGER</button> <br> <br> <div class="scroll"> <table class="blueTable"> <thead> <tr> <th>ID</th> <th>TITLE</th> <th>RELASE YEAR</th> <th>LENGTH</th> <th>EDIT</th> <th>DELETE</th> </tr> </thead> <tbody> <tr ng-repeat="film in cf.films | orderBy : '-filmId' | limitTo : 10"> <th>{{film.filmId}}</th> <th>{{film.title}}</th> <th>{{film.relaseYear}}</th> <th>{{film.length}}</th> <th align="center"> <button ng-click="cf.editFilm(film)">EDIT</button></th> <th align="center"> <button ng-click="cf.deleteFilm(film)">DELETE</button></th> </tr> </tbody> </table> </div> </div>
核心原理
AngularJS的双向数据绑定会自动监听vm.films的变化,只要这个数组更新了,视图里的ng-repeat就会自动重新渲染,不需要刷新整个页面。我们要做的就是在增删改操作的异步请求成功后,要么重新获取最新的列表数据,要么直接修改本地数组,触发绑定更新。
内容的提问来源于stack exchange,提问作者Davide Trevisan
相关产品推荐
相关产品推荐

