数组更改后,Angular不会更新视图

编程入门 行业动态 更新时间:2024-10-10 23:26:45
本文介绍了数组更改后,Angular不会更新视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我从服务中更新了阵列,但视图未更新.

I updated my array from service but view wasn't updated.

当我调用 $ scope.$ apply()或 $ scope.$ digest 时,它会记录

And when I call $scope.$apply() or $scope.$digest, it logs

$ digest已经在进行中

$digest already in progress

这是我的main.html文件. ctrl.flightsTo 是我提到的数组

This is my main.html file. ctrl.flightsTo is the array I mentioned

<md-progress-linear class="md-accent" ng-hide="ctrl.isFlightDataLoaded" mode="indeterminate"></md-progress-linear> <div class="md-padding"> <md-autocomplete ng-show="ctrl.isFlightDataLoaded" md-selected-item="ctrl.selectedItem" md-selected-item-change="ctrl.selectedItemChange(item)" md-search-text="ctrl.searchText" md-items="item in ctrl.querySearch(searchText)" md-item-text="item.name" md-min-length="0" placeholder="Choose a destination"> <md-item-template> <span md-highlight-text="ctrl.searchText">{{item.name}} - {{item.iata}}</span> </md-item-template> </md-autocomplete> <ul> <li ng-repeat="flight in ctrl.flightsTo">{{flight}}</li> </ul> </div>

这是我的MainCtrl.

And this is my MainCtrl.

调用 md-selected-item-change 事件时,我从 selectedItemChange 函数中的 flightDataService 获取航班数据.

When md-selected-item-change event is called, I get my flight data from flightDataService in selectedItemChange function.

但是Angular不会更新视图.

But Angular doesn't update views.

.controller('MainCtrl', function(flightDataService) { var self = this; self.isFlightDataLoaded = false; self.destinations = []; self.querySearch = querySearch; self.flightsTo = []; self.selectedItemChange = selectedItemChange; self.init = init; function querySearch(query) { var results = query ? self.destinations.filter(createFilterFor(query)) : self.destinations; return results; }; function createFilterFor(query) { var lowercaseQuery = angular.lowercase(query); return function filterFn(destination) { return angular.lowercase(destination.iata).indexOf(lowercaseQuery) === 0; } }; function selectedItemChange(item) { if (typeof item !== 'undefined') { self.flightsTo = flightDataService.getFlightsTo(item.iata); } }; function init() { flightDataService.loadAll().then(function() { self.destinations = flightDataService.getAirports(); self.isFlightDataLoaded = true; }).catch(function(error) { console.log(error); }); }; self.init(); });

最后,我附加了我的flightDataService.

Lastly, I attached my flightDataService.

它只返回保存的数据.

.factory('flightDataService', function($http, $q, papa) { var FLIGHT_DATA_URL = 's3-ap-southeast-2.amazonaws/glow-dev-assets/flight-data-gz.csv'; var self = this; self.flights = []; self.airports = []; self.routes = []; self.loadAll = loadAll; self.getAirports = getAirports; self.getFlightsTo = getFlightsTo; function loadAll() { var deferred = $q.defer(); loadAirportData().then(function(airports) { loadFlightData().then(function(flights) { processFlightData(flights, airports); deferred.resolve(); }).catch(function(error) { deferred.reject(error); }); }).catch(function(error) { deferred.reject(error); }); return deferred.promise; }; function loadAirportData() { var deferred = $q.defer(); $http({ method: 'GET', url: '/assets/airports.json' }).then(function(response) { deferred.resolve(response.data); }, function(error) { deferred.reject(error); }); return deferred.promise; }; function loadFlightData() { var deferred = $q.defer(); $http({ method: 'GET', url: FLIGHT_DATA_URL }).then(function(response) { deferred.resolve(response.data); }, function(error) { deferred.reject(error); }); return deferred.promise; }; function processFlightData(data, airports) { self.flights = papa.parse(data, { header: true }).data; var dests = self.flights.map(function(flight) { return flight.destination }); var destSet = new Set(dests); destSet.forEach(function(dest) { var airport = airports.find(function(airport) { return airport.iata === dest }); if (typeof airport !== 'undefined') { self.airports.push(airport); } }); self.flights.forEach(function(flight) { var origin = flight.origin; var dest = flight.destination; if (typeof self.routes[dest] === 'undefined') { self.routes[dest] = []; } if (typeof self.routes[dest][origin] === 'undefined') { self.routes[dest][origin] = { date: flight.date, delay: flight.delay, distance: flight.distance }; } }); return self.flights; }; function getAirports() { return self.airports; }; function getFlightsTo(destination) { return self.routes[destination]; }; return self; });

当我在控制台上登录 ctrl.flightsTo 时.

When I log ctrl.flightsTo on console.

总是好变的.

但是视图保持与空数组相同的状态.

But view stays same state as an empty array.

推荐答案

最后,我发现了!

因为我的 flightsTo 变量是关联数组,所以Angular不会更新它.

Because my flightsTo variable was associative array, Angular doesn't update it.

所以我将其更改为普通数组.

So I changed it to normal array.

此外,IAmDranged的观点也是正确的.

Also, the opinion of IAmDranged was also right.

谢谢大家!

更多推荐

数组更改后,Angular不会更新视图

本文发布于:2023-11-13 11:09:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1584202.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数组   视图   Angular

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!