В Office.js, в частности в Excel, вы можете добавлять / регистрировать обработчики событий (которые технически являются Обещаниями).Так, например, документация Microsoft приводит этот пример:
await Excel.run(async (context) => {
let sheet = context.workbook.worksheets;
sheet.onAdded.add(onWorksheetAdd);
await context.sync();
console.log("A handler has been registered for the OnAdded event.");
});
Я сейчас работаю в Angular, поэтому я хочу "преобразовать" весь этот код async
в observable
, чтобы иметь некоторое чувство контроля надвсе, что происходит в документе Excel.В приведенном выше примере мы слушаем, когда пользователь добавляет новый рабочий лист.onWorksheetAdd
зарегистрирует этот обработчик событий, чтобы при выполнении пользователем действия (добавление новой рабочей таблицы) вызывался обратный вызов / обещание onWorksheetAdd
.
Ниже приведено то, что у меня есть в данный момент.
excel-worksheet.service.ts
registerOnAddWorksheetHandler() {
return from(
// @ts-ignore
Excel.run((context) => {
let sheet = context.workbook.worksheets;
sheet.onAdded.add(this.excelEventHandlerService.onAddWorksheetHandler) ; // must pass Promise as argument
console.log("A handler has been registered for the OnAdded event.");
}
return context.sync();
})
);
}
excel-event-handler.service.ts
onAddWorksheetHandler(event): Promise<any> {
return of(
// @ts-ignore
Excel.run((context) => {
console.log("Handler for worksheet onAdded event has been triggered. Newly added worksheet Id : " + event.worksheetId, event);
return context.sync();
})
)
.toPromise()
}
По сути, я хочу обернуть обработчик событий в Observable, чтобы мой app.component.ts
можете зарегистрировать информацию в моем приложении.
Я попробовал следующее:
- В течение
onAddWorksheetHandler
я попытался продолжить выполнение Обещаний.После этого я позвонил .then()
после context.sync()
, затем снова позвонил на Excel.run()
, а затем позвонил после toPromise()
.Это неудачно, потому что registerOnAddWorksheetHandler
зарегистрировал событие и не будет иметь доступа к его значению.Главным образом потому, что Office.js основан на Promise, поэтому выполнение является единым и выполненным. - Я попытался объявить
Subject
для excel-event-handler.service.ts
, чтобы app.component.ts
мог иметь доступ, но это также не удалось.Я не уверен, что зарегистрированный обработчик событий проглатывает что-либо, пытаясь всплыть.
Моя последняя попытка решить эту проблему - просто переместить эти зарегистрированные обработчики событий в app.component.ts
, чтобы получитьдоступ к объему.Я надеялся сделать это немного более элегантно.