我从服务中更新了阵列,但视图未更新.
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不会更新视图
发布评论