前端应用贡献

注意,文档里所有“贡献”基本都可以作为一个名词理解,大概就是对外提供的功能,做出的贡献。

 

前端应用程序贡献可以响应 Theia 前端应用程序的生命周期事件,以在前端启动或停止之前执行行为,或者在前端布局初始化后执行。除了提供一般有用的启动钩子外,前端应用程序贡献还通常用于打开和排列视图、注册侦听器、添加状态栏项或在应用程序启动时自定义应用程序外壳的布局。另一个用例是对关机做出反应,例如,在关机时保留某些应用程序数据,例如使用存储服务。

与任何其他前端贡献一样,前端应用贡献也通过绑定 FrontendApplicationContribution 接口的实现注册在前端模块中。一个典型的模式是一个在启动时总是会打开的视图。因此视图实现不仅扩展了 AbstractViewContribution<MyWidget>,而且还注册为 FrontendApplicationContribution 以在应用程序外壳布局初始化后打开视图。

export default new ContainerModule(bind => {
   …
   bindViewContribution(bind, MyViewContribution);
   bind(FrontendApplicationContribution).toService(MyViewContribution);
}

除了视图实现本身之外,视图现在可以从 FrontendApplicationContribution 接口实现方法 initializeLayout(app: FrontendApplication) 。实现在布局初始化后打开自己。 请注意,只有在用户没有存储过可用的工作台布局时才会调用此方法,这使得实现初始工作台布局非常理想,因为它不会覆盖用户在先前会话中手动对布局做出的修改。

@injectable()
export class MyViewContribution extends AbstractViewContribution<MyViewWidget>
    implements FrontendApplicationContribution {
   …
   async initializeLayout(app: FrontendApplication): Promise<void> {
       await this.openView();
   }
   …
}

如果每次启动应用程序时都需要调用前端应用程序贡献 ,而不仅仅是在用户没有存储自定义的布局时,则可以使用方法 configure(app: FrontendApplication) 和 onStart(app: FrontendApplication) 。 由于这些方法甚至在附加应用程序外壳或初始化菜单之前就被调用,你可以望将这些方法与前端应用程序状态服务结合使用,具体取决于您的:

@injectable()
export class MyViewContribution extends AbstractViewContribution<MyViewWidget>
    implements FrontendApplicationContribution {
   …
   @inject(FrontendApplicationStateService)
   protected readonly stateService: FrontendApplicationStateService;
   …
   async onStart(app: FrontendApplication): Promise<void> {
       this.stateService.reachedState('ready').then(
           () => this.openView({ reveal: true })
       );
   }
}

前端应用程序贡献的另一个典型用例是安装侦听器,例如 对用户配置的的更改做出反应,或者分别在 configure(app: FrontendApplication) 和 onStart(app: FrontendApplication) 中将自定义小部件添加到应用程序。

posted @ 2022-08-03 11:29  theiaide  阅读(184)  评论(0编辑  收藏  举报