AngularJS 1.5组件模板完全渲染后触发功能

AngularJS 1.5 component Trigger function after template fully rendered

我正在使用 Angular 的 1.5 组件。

基本上我需要在模板完全渲染后触发一个函数。

Components layout

所有这些组件都在一个父组件中。 组件 1 有一个 ng-repeat 内部填充了卡片,但我需要将组件 2 的高度设置为等于组件 1 的高度。

组件 1 包含动态数据,因此它可能会长一点或短一点,而且我没有找到任何智能方法来检索组件 1 的完整高度。

编辑:

在 COMP 1 中,数据已经由父组件加载,我在使用 ng-repeat 逐步填充组件时遇到了问题。

我认为你应该在你的父组件中有 state 属性 并从子组件更新它

function ParentComponentController () {

    var vm = this;

    vm.readyStatus = {
      Component1: false,
      Component2: false,
      // etc
    }

    vm.checkReadyStatus = function(){

       var isReady = true;

       for(status in vm.readyStatus) {
          if(status == false) {
              isReady = false;
          }
       }

       return isReady;

    }

    vm.resizeHeights = function() {

       if(vm.checkReadyStatus()) {
           // do resize
       }
    }
}

因此您需要将 vm.resizeHeights 传递给您的子组件

ChildComponent1 = {
   bindings: {
      resizeHeights: '&',
      readyStatus: '='
   },
   controller: function() {

       var vm = this;

       doAsyncRequest().then(function(){
            vm.readyStatus = true; 
            vm.resizeHeights() // so if template is ready, we execute resize  
       })

   }
}

希望对你有所帮助

认为最好的解决方案是在 css 中使用 flexbox 布局来处理这个问题(angular-material 更容易)。

如果你坚持要在javascript中进行高度校正,那么我会制作第三个组件,同时包含组件 1 和组件 2。 然后在新组件的$postLink函数中,可以使用$element获取子元素,并调整高度。

也许您需要不同的方法?

我的意思是如果你的父组件中已经有所有的数据,并且你不能在ng-repeat结束后触发resizeHeight

<div class="container></div>

还有一些 css flexboxes

 .container {
   display: flex;
   flex-wrap: wrap;
} 

这使得所有 div 高度相等

但也有一些不好的解决方法,例如:

在父组件中

 setTimeout(function(){
   //Do resize

   scope.$apply();
 }, 0)

我还记得那件事:

在你重复的 childComponent 中你可以访问

if (scope.$last){
  // do resize 
}