Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在加载数据之前加载角度控制器_Javascript_Angularjs - Fatal编程技术网

Javascript 在加载数据之前加载角度控制器

Javascript 在加载数据之前加载角度控制器,javascript,angularjs,Javascript,Angularjs,我正在编写一个从API加载电影信息的简单应用程序。加载之后,我尝试使用Angular在一个简单的列表视图中显示电影。我正确地加载了电影,但似乎创建了角度控制器,并在填充电影阵列之前将电影阵列发送到视图。我不知道该如何解决这个问题 var movieList = []; var app = angular.module('top250', []); // immediately make a call to the server to get data (array of movies from

我正在编写一个从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>
您需要等待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方法中,并在完成后将其与回调一起发送,但这只是一个首选项。

首先,我将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,您可以将scope var设置为promise中的数据,这样生活就会好起来
这很有效。一件事;div是通过angular填充的,但是{{}中的内容不是。。电影数组中的对象肯定有“title”和“plot”字段。知道怎么回事吗?我测试了omdbapi,看起来你需要第一个大写字母:movie.Title/movie.Plot,请使用控制台记录响应……我注意到了这一点,这不是问题所在。事实证明,这是因为我使用的是节点js模板系统hogan,它使用与angular相同的分隔符。呵呵。