前端应用贡献
注意,文档里所有“贡献”基本都可以作为一个名词理解,大概就是对外提供的功能,做出的贡献。
前端应用程序贡献可以响应 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) 中将自定义小部件添加到应用程序。