我有一个 AngularJS (1.7) 应用程序,它正在使用 ngUpgrade 迁移到 Angular 7。因此 AngularJS 和 Angular 框架同时运行,新组件是用 Angular 编写的,有时这些现代 Angular 组件会在遗留 AngularJS 组件中使用。
就我而言,父组件在某些情况下需要与子组件进行通信。
ngUpgrade文档清楚地展示了如何从 Angular 子组件向父 AngularJS 组件传递数据和传播事件:
<legacy-angularjs-component>
<div>{{ $legacyCtrl.whatever }}</div>
<modern-angular-child-component
[data]="$ctrl.initialDataForChildComponent"
(changed)="$ctrl.onChildComponentChanged($event)"
>
</modern-angular-child-component>
</legacy-angularjs-component>
为了实现这一点,您只需向 Angular 子组件添加几个属性:@Input() data;
用于初始数据,@Output() changed = new EventEmitter<WhateverThing>();
然后可以通过执行this.changed.emit(this.whateverThing)
.
这一切都有效,但是将事件从父母传播到孩子呢?我知道如何在 Angular 中做到这一点,例如使用@ViewChild
或使用 observables,但这些机制在我的应用程序的 AngularJS 环境中不可用。所以父组件不能使用它们。
我尝试过的两种可行的方法是:
创建两个组件共享的单独服务。
将父控制器的引用传递给子控制器,如下所示:
<legacy-angularjs-component>
<div>{{ $legacyCtrl.whatever }}</div>
<modern-angular-child-component
[observe]="$ctrl.registerObserver",
>
</modern-angular-child-component>
</legacy-angularjs-component>
...然后让子组件调用此observe
函数:
ngOnInit() {
if (this.observe) {
// Pass reference to child component to the
// parent, so parent can directly send it messages.
this.observe(this);
}
}
这样,一旦设置了组件,父级就可以直接引用子级。子进程实现了一些 TypeScript 接口,该接口定义了父进程可以调用以通知子进程事件的所有子进程方法。
这两种方法都有效,但它们都让我觉得很笨拙,而且对于像向子组件发送事件这样简单的事情要做很多繁琐的事情。
由于这在 AngularJS 和 Angular 中都很容易做到,我想知道我是否可能会错过在 的上下文中做同样事情的更简单/更简单的方法ngUpgrade
,其中父级是 AngularJS,子级是 Angular 7。
还是我的第二种方法是一种合理的方法?