Vue не обнаруживает изменений, когда неопределенное свойство добавляется внешней библиотекой - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь создать средство визуализации формы, но у меня возникают проблемы с корректным обновлением содержимого формы.Я создал песочницу с минимальной версией: https://codesandbox.io/s/23z4y1n9kp

Задача

Форма имеет три поля: a, b и c.Инициализируется со значением для a и одним для b, но не для c.Когда я обновляю значения для a или b, я вижу также обновление содержимого формы, и в консоли я вижу, что метод установки вызывается с правильным значением.Однако, когда я заполняю значение для c, на странице ничего не происходит, но консоль показывает, что установщик был вызван правильно.Это означает, что объект документа был обновлен правильно, но Vue не знает его.

Внешняя библиотека вызывает сеттер

Я понимаю, Vue не может наблюдать неопределенные свойстваили обнаружить новые свойства (https://vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats).. Вы должны сделать Vue.set, чтобы заставить Vue наблюдать за ними. Однако в этом случае это невозможно, потому что я использую внешнюю библиотеку , которая выполняетфактическая установка значения: docmod.

Я включил в песочницу минимальную версию библиотеки, чтобы дать вам представление о том, что она делает. Именно эта библиотека добавляет значение полейк объекту документа. Для этого используются специальные методы получения и установки, я хочу сохранить эти методы получения и установки, чтобы docmod продолжал работать так, как ожидалось.

То, что я не могу сделать

  • Определите c, установив documentContent: { value: { a: '1', b: 'foo', c: '' }}. Заранее неизвестно, какие свойства будут присутствовать
  • Измените библиотеку docmod, чтобы поместить туда Vue.set

Возможные решения

Есть ли способ заставить Vue наблюдать за полным объектом документа и обнаруживать изменения в полях, которые не имеют начального значения?Предположим, что docmod может уведомить меня что-то изменилось, могу ли я заставить Vue каким-либо образом обновить свою страницу?Могу ли я переопределить свойства объекта значения, чтобы обернуть исходные методы получения и установки с помощью кода, который вызывает Vue.set?

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 17 октября 2018

Вы можете позвонить this.$forceUpdate();, чтобы заставить Vue обновить экран.Это не рекомендуемый способ ведения дел, но в вашем случае я не вижу других.

Смотрите обновленную версию здесь: https://codesandbox.io/s/zk4vy6qly3

Я добавил метод refreshв вашем Form.vue, что связано с @input для вашего текстового поля.Этот метод вызывает this.$forceUpdate();, чтобы заставить Vue перерисовываться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...