Как обернуть наблюдаемое вокруг обработчика событий Office.js Excel - PullRequest
1 голос
/ 08 июля 2019

В 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, чтобы получитьдоступ к объему.Я надеялся сделать это немного более элегантно.

1 Ответ

0 голосов
/ 15 июля 2019

Это было недоразумение с моей стороны. Случай, когда я не видел лес за деревьями. Для обработчиков событий office.js вам нужно всего лишь выполнить команду Excel.run() и context.sync(), чтобы просто зарегистрировать <some_callback()>.

Excel.run((context) => {
  let sheet = context.workbook.worksheets;
  sheet.onAdded.add(<some_callback()>);
  return context.sync();
})

Там, где лежало мое замешательство, я предполагал, что весь танец Excel.run() должен быть исполнен в пределах <some_callback()>. Оказывается, это не так, вы можете использовать этот типичный обратный вызов JS. В Angular это может быть любой метод из компонента, который должен быть выполнен. Та же логика применима к любой другой структуре.

Надеюсь, это поможет другим.

...