angularjs - 在定义范围变量之前调用ng-repeat

时间:2017-01-28 05:43:00

标签: javascript angularjs

我有md-tabs设置,我将其绑定到$scope.selectedIndex,以便我可以在需要时通过代码更改它。

我使用一个按钮,调用我的更新数据的函数,然后将$scope.selectedIndex更改为所需的标签号(在本例中为3),然后更改所选标签。

所有这一切都很好,除非它在$scope.selectedIndex调用完成之前调用.forEach(),这导致ng-repeat无法正常工作,因为它没有定义,因此没有错误地退出。

按钮通话: ng-click="initTVShow(show)"

功能:

$scope.initTVShow = function(show) {
  var rng = "";
  var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  for( var i=0; i < 10; i++ )
    rng += possible.charAt(Math.floor(Math.random() * possible.length));

  $scope.show = show;
  $scope.show_name = show.title.split(' ').join('') + "-" + rng;
  $scope.poster = show.images.poster;
  $scope.backdrop = show.images.poster;
  $scope.seasons = [{},{}];

  getShow(show.imdb_id, function (err, show) {
    for (let i = 0; i < 10; i++) {
      $scope.seasons[i] = show.episodes.filter((episode) => episode.season === i);
    }
  });
  $scope.selectedIndex=3;
};

如您所见,$scope.selectedIndex=3;基本上更改为选项卡#4(从0开始)。

然后下面的ng-repeat似乎不起作用,很可能是因为.forEach尚未完成。我测试了带有2个空索引的$ scope.seasons进行测试,并且可以正常工作。

<span ng-repeat="season in seasons">{{season.number}}</span>

3 个答案:

答案 0 :(得分:1)

我认为这是因为函数getShow以异步方式检索数据。向我们展示。 试试这个:

getShow(show.imdb_id, function (err, show) {
  show.episodes.forEach(function(array){
    $scope.seasons[array.season] = array;
    });
    $scope.selectedIndex=3;
});

答案 1 :(得分:1)

这是因为数据没有准备好,而DOM是。 您可以通过在元素上添加ng-if并检查数据是否准备好来轻松解决。

像:<span ng-if="season.number" ng-repeat="season in seasons">{{season.number}}</span>

答案 2 :(得分:0)

我找到了解决方案,它实际上只是由for()循环(哪个预编辑,是.forEach)引起的,我简单地给它添加了一个回调,这改变了标签它只是工作了!

更改


for (let i = 0; i < 11; i++) { }

要: for (let i = 0; i < 11 || function(){ $scope.selectedIndex=3; }(); i++) { }