Как привязать стороннее событие к rxjs observable

#rxjs #observable

#rxjs #наблюдаемое

Вопрос:

Я использую сторонний текстовый редактор froala в проекте, и для события keyup мне нужно передать функцию обратного вызова, чтобы я мог получить значение обратно из редактора. Я пытаюсь каким-то образом обернуть функцию обратного вызова в observable, чтобы я мог использовать debounceTime но я не могу заставить ее работать правильно, вот некоторый код:

в моем файле компонента:

 export class EditorComponent
  editorOptions = {
    events: {
      'froalaEditor.keyup': (e, editor) => {
        do stuff here
      },
    }
  };
}
  

Я пытался использовать это для события keyup, но это не работает, потому что оно настраивает новое наблюдаемое для каждого события:

 'froalaEditor.keyup': (e, editor) => {
  const text = editor.html.get();
  Observable.create(o => {
    this.service.updateData(data);
  }).pipe(takeUntil(this.ngUnsubscribe))
    .pipe(debounceTime(1000))
    .subscribe();
}
  

как правильно заставить это работать?

Комментарии:

1. Я думаю, это сработает для вас: rxjs-dev.firebaseapp.com/api/index/function/bindCallback

Ответ №1:

Вы могли бы создать автономный файл Subject и вставить в него значения, например:

 export class EditorComponent
  private onKeyup$ = new Subject();

  editorOptions = {
    events: {
      'froalaEditor.keyup': (e, editor) => {
        onKeyup$.next(e);
      },
    }
  };
}
  

Важно: в этом случае вам придется позаботиться о завершении подписки самостоятельно. Найдите надлежащее наблюдаемое завершение в компонентах для вашей конкретной платформы.

или

Если у вас есть ссылка на узел editor DOM — вы могли бы использовать fromEvent событие froala froalaEditor.keyup (см. Документы froala).

Например.

 const onKeyup$ = fromEvent(froalaDOMNode, 'froalaEditor.keyup');
  

В этом случае observable завершится после уничтожения узла DOM, поэтому вам не придется беспокоиться об отмене подписки вручную.