Javascript 需要另一个升级组件的升级AngularJS组件可以';使用角度内容投影时,无法找到父控制器

Javascript 需要另一个升级组件的升级AngularJS组件可以';使用角度内容投影时,无法找到父控制器,javascript,angularjs,angular,typescript,ng-upgrade,Javascript,Angularjs,Angular,Typescript,Ng Upgrade,我试图在我的应用程序的一个模块上为ngUpgrade做一个PoC,但我遇到了一个问题,即转换/内容投影以及AngularJS要求 假设有一个降级的角度分量,定义如下: @Component({ selector: 'common-filter', template: ` <ajs-filter> <div>Common Filter</div> <ajs-button text="Outside of conten

我试图在我的应用程序的一个模块上为ngUpgrade做一个PoC,但我遇到了一个问题,即转换/内容投影以及AngularJS
要求

假设有一个降级的角度分量,定义如下:

@Component({
  selector: 'common-filter',
  template: `
    <ajs-filter>
      <div>Common Filter</div>
      <ajs-button text="Outside of content projection"></ajs-button>
      <ng-content></ng-content>
    </ajs-filter>
})

export class CommonFilter {}
正常使用
common filter
效果很好,但是当投影
ajs按钮时,如:

<common-filter>
  <ajs-button text="Inside of content projection"></ajs-button>
</common-filter>


上面的代码片段来自
index.html
common filter.component.ts
。这是一个(或多或少)基于更复杂组件的最小示例。出于性能原因,我将采用降级模块方法。

一位维护人员gkalpak在我为此发布的Github问题中提供了解决此问题的方法:

简而言之,这是不同控制器初始化顺序的问题。 要解决此问题,您可以将父级
require
设置为可选,然后使用
setTimeout
等待父级控制器初始化:

this.$onInit = () => {
  this.requireAjsFilterCtrl().then(() => console.log('!', !!this.ajsFilterCtrl));
}

this.requireAjsFilterCtrl = () => {
  return new Promise(resolve => {
    setTimeout(() => {
      this.ajsFilterCtrl = this.ajsFilterCtrl || $element.controller('ajsFilter');
      resolve(this.ajsFilterCtrl);
    });
  });
};
可以在此处看到解决方法的实际作用:

我不知道如何传达这一点,但对于我问题的其他潜在编辑,请在建议错误编辑之前研究ngUpgrade是什么。
this.$onInit = () => {
  this.requireAjsFilterCtrl().then(() => console.log('!', !!this.ajsFilterCtrl));
}

this.requireAjsFilterCtrl = () => {
  return new Promise(resolve => {
    setTimeout(() => {
      this.ajsFilterCtrl = this.ajsFilterCtrl || $element.controller('ajsFilter');
      resolve(this.ajsFilterCtrl);
    });
  });
};