Сохранить экземпляр класса в данные Vue

Я пытаюсь использовать PDFtron в одном из моих компонентов Vue. Я создаю экземпляр iFrame для просмотра PDF-файлов в смонтированном хуке, чтобы при загрузке Vue кадр PDF отображался готовым к загрузке PDF-файлов:

mounted() {
    const viewerElement = document.getElementById('viewer');
    this.viewer = new PDFTron.WebViewer({
      path: 'https://www.pdftron.com/4.0/lib',
      l: 'apikey'
    }, viewerElement);
  }

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

 methods: {
    getPDF() {
      this.viewer.loadDocument('https://pdftron.s3.amazonaws.com/downloads/pl/webviewer-demo.pdf')
    }
  }

Чтобы сделать это, я подумал, что могу создать переменную viewer в своих переменных данных, а затем сохранить в ней средство просмотра pdftron, поэтому я сохраняю средство просмотра в this.viewer. К сожалению, всякий раз, когда я вызываю функцию getPDF, я получаю следующую ошибку: The viewer instance is not defined yet. Я не уверен, что это правильный способ сохранить экземпляр класса в Vue.

Функция getPDF вызывается для кнопки следующим образом:

<v-btn color="primary" @click="getPDF(url)" :disabled="!valid">Load PDF</v-btn>'

Обновление:

Я обновил свою функцию getPDF следующим образом:

getPDF() {
      const viewerInstance = this.viewer.getInstance()
      viewerInstance.loadDocument('https://pdftron.s3.amazonaws.com/downloads/pl/webviewer-demo.pdf')
    }

но я все равно получаю ту же ошибку The viewer instance is not defined yet и "Не удается прочитать свойство loadDocument of undefined"


person Nick    schedule 12.01.2019    source источник
comment
Вероятно, это вопрос времени. Можете ли вы показать, где/когда происходит вызов getPDF?   -  person    schedule 12.01.2019
comment
@ eric99 это вызывается с кнопки. Я добавил это в исходный вопрос.   -  person Nick    schedule 12.01.2019
comment
ваш #viewerElement находится в том же компоненте Vue?   -  person yqlim    schedule 12.01.2019
comment
@YongQuan Да, в приведенном выше шаблоне вот так: <div id='viewer' style='width: 1024px; height: 600px;'> </div>   -  person Nick    schedule 12.01.2019
comment
Мне кажется, все в порядке, единственное, что я могу предложить, это объявить переменную просмотра вне компонента. При использовании SFC объявите с помощью let viewer; внутри тега <script>, но перед export default {.... Затем ссылайтесь на него без this.   -  person    schedule 12.01.2019
comment
Кстати, The viewer instance is not defined yet. кажется сообщением об ошибке PDFTron, а не Vue или DOM. Если да, то проблема не во Vue, а в PDFTron.   -  person yqlim    schedule 12.01.2019


Ответы (1)


Каким-то образом вы запускаете нажатие кнопки до того, как WebViewer загрузится и инициализируется.

Вы не можете взаимодействовать с WebViewer API (кроме конструктора), пока не получите готовое событие. https://www.pdftron.com/api/web/PDFTron.WebViewer.html#event:ready__anchor

См. пример на этой странице. https://www.pdftron.com/documentation/samples/js/viewing

Я бы порекомендовал добавить прослушиватели ваших кнопок в прослушиватель готовых событий, чтобы пользователи могли использовать эти кнопки только после того, как средство просмотра будет готово.

person Ryan    schedule 14.01.2019