Обнаружение изменений в элементах данных, прикрепленных к полям через v-модель - PullRequest
0 голосов
/ 16 октября 2019

У меня есть приложение Vue большого размера, использующее Vuetify, которое состоит в основном из форм, и мне нужно добавить функцию обнаружения, когда было внесено изменение в значение в любом из полей формы, чтобы при переходе пользователяот формы и несохраненных изменений, их можно предупредить. Я могу справиться с настройкой значений, чтобы указать изменения и выдать предупреждение, но первое, что мне нужно сделать, это уметь обнаруживать изменения в различных полях.

Базовая структура:

1) Создайте объект, который содержит различные значения для полей формы:

class Tenant {
  constructor(tenant) {
    this.code = tenant.code || '';
    this.name = tenant.name || '';
    this.defaultPostBack = tenant.defaultPostBack || '';
    this.maxIdentities = tenant.maxIdentities || '';
  }
}

export default Tenant;

2) Определите его в компоненте data:

  data: () => ({
    tenantModel: new Tenant({}),
  })

, но также можнообновляется в других местах кода, например при извлечении записи из внутреннего интерфейса:

this.tenantModel = new Template({tenant})

3) Привязать элементы объекта к отдельным полям с помощью v-model:

<v-layout row>
  <v-flex xs6>
    <v-text-field v-bind="fields.defaultPostBack"
      v-model="tenantModel.defaultPostBack" />
  </v-flex>
  <v-flex xs6>
    <v-text-field v-bind="fields.maxIdentities"
      v-model="tenantModel.maxIdentities" />
  </v-flex>
</v-layout>

Первоначально я думал сделать watch для объекта tenantModel, чтобы отследить изменения поля, но единственный раз, когда часы на tenantModel срабатывают, это когда вызывается такая строка, как this.tenantModel = new Template({});изменение значения в одном из связанных полей не вызывает его.

Я знаю, что один вариант - добавить обработчик @input или @change (в зависимости от типа поля) для каждого поля, но этотонна работы, и в некоторых местах есть поля, например v-combobox, в которых уже есть прослушиватели этих событий.

Есть ли способ наблюдать за связанным объектом данных? ? Или я собираюсь добавить слушателей на отдельных полях?

1 Ответ

0 голосов
/ 16 октября 2019

Вы пробовали deep watcher?

Создал этот jsfiddle для справки https://jsfiddle.net/efqy6pmo/

Также ознакомьтесь с документацией для получения дополнительных опций https://vuejs.org/v2/api/#watch

Ссылка: Vue.js - Как правильно следить за вложенными данными

...