如何在所有多个嵌套ng重复完成后调用函数?

cmssoen2  于 2021-09-29  发布在  Java
关注(0)|答案(0)|浏览(193)

我已经阅读了很多关于使用指令或 $last 要在ng repeat结束时调用函数,即使是两个级别的嵌套ng repeat,但与嵌套ng repeat的级别无关。我认为问题与自动加载新页面/视图有关,而ng repeat仍在呈现元素…新页面加载,但返回ng repeat创建的列表会导致奇怪的事情发生。
简单的例子:

<div ng-repeat="products in categories" ng-init="$last && listLoaded()"> // length = 12
  <div ng-repeat="product in products">
    <div ng-if="product.type == 1" ng-repeat="feature in product.features"> // length = 20
      <div ng-if="feature.specs == 1" ng-repeat="specs in feature.specs"> // length = 40
      </div>
      <div ng-if="feature.desc == 1" ng-repeat="desc in feature.desc"> // length = 4
      </div>
      <div ng-if="feature.reviews > 0" ng-repeat="review in feature.reviews"> // length = 125
        <div>{{review.review}}
        <div ng-if="review.pictures > 0" ng-repeat="pictures in review.pictures">  // length = 3
           <img src="blah.com/imgs/{{picture.picURL}}" id="picture.pictureID" ng-click="enlargeImage(picture.pictureID)">
        </div>
      </div>
    </div>
  </div>
</div>

$scope.listLoaded = function() {
  if ($stateParams.prodID) {
     //external ID passed in, autoload featurePage
     $state.go("tabs/search/" + featurePage", {product : productID}) ;
  }
}

$scope.enlargeImage = function(id) {
  var el = document.getElementById(id) ;
  el.style.border = "1px solid red" ;
  el.style.display = "block" ;
  console.log(el) ;
  angular.element('#'+id).border = "1px solid red" ;
  angular.element('#'+id.display = "block" ;
}

如您所见,有多个嵌套的ng重复,所有长度都不同,它们的渲染时间都大不相同。我需要在所有嵌套ng重复中的所有项都完成渲染后执行函数 listLoaded 调用其他选项卡/视图/页面。
当传入外部id时,它将自动加载功能页。一切都很好, featurePage 已加载所有正确的信息。但是,当我返回列表页面时,整个页面都在那里,但是当单击图像时,虽然函数正在执行,但是图像没有得到应用于它们的样式。
的console.log输出 el 显示应用于元素(但在开发人员工具中)的样式 Elements -> Styles 在第节中,样式实际上没有应用于元素,并且视觉上没有任何图像样式发生更改。

console.log output:
     <img src="blah.com/imgs/{{picture.picURL}}" id="picture.pictureID" ng-click="enlargeImage(picture.pictureID)" style="border:1px solid red;display:block;">

在自动加载到 featurePage ,如果我参照产品列表页面,未呈现样式更改的相同元素仍然存在问题,它们不会更改。视图被缓存。当我删除页面缓存时,一切正常。因此,问题必须与dom元素没有完全呈现或添加到dom中有关。
当我评论出 listLoaded() 功能,并且不强制自动加载 featurePage ,完整列表呈现,所有ng单击都正常工作。然后,我可以手动单击特定产品以转到 featurePage -然后再回到列表中,一切仍然正常。我认为这个问题与 angular.element 在页面视图自动加载到页面之前未完全加载 featurePage -但我不确定。我只知道当我不自动重定向到 featurePage 我甚至在第一次ng repeat上尝试了一个指令,但仍然存在相同的问题:

.directive('listRepeatDirective', function() {
  return function(scope, element, attrs) {
    angular.element(element).css('color','blue');
    if (scope.$last){
      scope.listLoaded() ;
    }
  };
})

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题