加载数据之前加载角度控制器
Angular Controller Loading Before Data Is Loaded
我正在编写一个简单的应用程序,从API加载电影信息。加载后,我尝试使用 Angular 在简单的列表视图中显示电影。我正确加载了电影,但似乎创建了角度控制器,并在填充电影数组之前将电影数组发送到视图。我不确定如何解决这个问题。
var movieList = [];
var app = angular.module('top250', []);
// immediately make a call to the server to get data (array of movies from text file)
$.post('/', {}, function(data) {
init(data);
});
app.controller('MovieController', function() {
// should be setting this.movies to an array of 250 movies
this.movies = movieList;
});
function init(data) {
// cycle through array, use title to retrieve movie object, add to array to be sent to view
$.each(data, function(index, value) {
var title = value.split(' (')[0];
title = title.split(' ').join('+');
var url = 'http://www.omdbapi.com/?t=' + title + '&y=&plot=short&r=json';
$.getJSON(url, function(data) {
console.log('in get json', data);
var movieObj = data;
storeMovie(movieObj);
});
});
}
function storeMovie(movieObj) {
movieList.push(movieObj);
}
还有我的 HTML(虽然我确定这不是问题:
<body ng-controller="MovieController as MovieDB">
<div class="row">
<div class="large-12 columns">
<h1>IMDB Top 250 List</h1>
</div>
</div>
<div class="row">
<div class="large-12 columns" id="movie-list">
<div class="list-group-item" ng-repeat="movie in MovieDB.movies">
<h3>{{movie.Title}} <em class="pull-right">{{movie.Plot}}</em></h3>
</div>
</div>
<script src="js/foundation.min.js"></script>
<script>
$(document).foundation();
</script>
</body>
首先,我将你的 ajax 调用转换为一个角度工厂:
app.factory('MoviesService', function($http, $q) {
function getMovie(value) {
var title = value.split(' (')[0];
title = title.split(' ').join('+');
var url = 'http://www.omdbapi.com/?t=' + title + '&y=&plot=short&r=json';
return $http.get(url).then(function(res){ return res.data; });
}
return $http.post('/').then(function(res) {
return $q.all(res.data.map(getMovie));
});
});
然后我可以像这样消费它:
app.controller('MovieController', function(MoviesService) {
var self = this;
MoviesService.then(function(movies) {
self.movies = movies;
});
});
- 不要使用 jquery
- 使用角度$http或$resource
- 使用$http,您将范围VaR设置为promise中的数据,生活会很好
您需要
等待init
方法完成:
function init(data, complete) {
$.each(data, function(index, value) {
var title = value.split(' (')[0];
title = title.split(' ').join('+');
var url = 'http://www.omdbapi.com/?t=' + title + '&y=&plot=short&r=json';
$.getJSON(url, function(data) {
console.log('in get json', data);
var movieObj = data;
storeMovie(movieObj);
}).always(function(){ // count competed ajax calls,
// regardless if they succeed or fail
if(index === data.length -1)
complete(); // call callback when all calls are done
});
});
}
现在您可以执行此操作:
app.controller('MovieController', function() {
$.post('/', {}, function(data) {
init(data, function(){
this.movies = movieList;
});
});
});
就个人而言,我只会将movieList
保留在 init
方法中,并在完成后将其与回调一起发送,但这只是一个首选项。
相关文章:
- 单击angularjs中的另一个控制器时重新加载控制器
- 使用控制器作为语法和 ngRoute 分别加载控制器
- 如何在打开模型时动态加载控制器文件
- RequireJS with Angularjs 用于在同一页面上加载控制器
- 在不重新加载控制器的情况下更新路由
- 茉莉花/棱角.js $scope在加载控制器上未定义
- 引导选项卡上的 MVC 单击重新加载控制器并刷新
- ng-view - 模板页面中的加载控制器
- 角度 ui 路由器可选查询参数加载控制器两次
- 角度 ui 路由器未加载控制器或模板
- AngularJS 1.2.0:延迟加载控制器和模板
- AngularJS 返回加载控制器的泛型函数
- EmberJS:基于另一个属性重新加载控制器模型的最佳方法
- AngularJS从文件夹加载控制器
- ui sref opts={reload:true}不重新加载控制器
- CI-使用Javascript按钮加载控制器
- 在angularjs$routeProvider中动态加载控制器
- 在ionic中重新加载控制器
- Angular JS-点击加载控制器功能
- 可以在Angular中动态加载控制器