AngularJS 消化细微差别还是我只是愚蠢? ng 如果渲染组件两次?

AngularJS digest nuance or am I just dumb? ng if renders component twice?

不幸的是,我无法为这种情况创建可重现的片段。它发生在一个相当复杂的代码库中,足以说明。

我有一个组件方法 onClick 将标志设置为 true。 例如

// in the template
<button type='button' ng-click="onClick()"></button>

//javascript

angular.module('myModule')
  .component('MyComponent', {
  ...
  controller: [function(){
    var ctrl = this;
    ctrl.showModal = false;
    ctrl.onClick = function() {
      ctrl.showModal = true;
    }
  }]
})

此标志与 ng-if 一起使用,后者实例化另一个 $onInit 呈现模态的组件。例如

//in the template

<my-modal-component ng-if="$ctrl.showModal"></my-modal-component>


//javascript
angular.module('myModule')
  .component('myModalComponent', {
  ...
  controller: [function(){
    // renders third party modal
    var renderModal = function() {}
   
    // makes and returns an api call to get some data as a promise
    var getRelevantData = function(){}


    this.$onInit = function () {
      getRelevantData().then(function(){
        renderModal();
      })
    }
  }]
})

出于某些疯狂的原因,当单击按钮时,myModalComponent 实际上会得到两个单独的实例(即呈现两次,一个在另一个之上)。我知道范围有一些 ng-if 细微差别,但我在这里没有使用 $scope,甚至将标志放在对象中也没有用。

ng-show 进行了一些 if 检查以呈现模态类型的作品,但我的数据绑定都搞砸了(我传递给 myModalComponent 的方法是在 ng-show 为 false 时定义的,但是当ng-show 更改为 true,它是未定义的)所以如果可以的话,我宁愿不要去那个兔子洞;另外,我认为 ng-if 在这里更有意义。

更疯狂的是,如果我在按钮单击时放置 $timeout(, 10000) 将标志设置延迟到 10 秒 (onClick), 模态仍然呈现一次立即十秒后,另一个模态呈现在它上面。

诚然,我尽量远离摘要循环,因为我知道知道它很重要,但具有讽刺意味的是,它是一种反模式,可以搞砸...那么有人有什么想法吗?

我想念 React。

使用 angular 1.5.9 时出现问题。我看到了其他摘要问题,但独立处理了它们,但这个问题或多或少是一个表演障碍。所以升级到 1.8,问题就消失了。