Установка свойства VueJS model не обновляет элемент select в DOM

#javascript #vue.js #vue-component

#javascript #vue.js #vue-компонент

Вопрос:

У меня есть каскадный выпадающий список с использованием VueJS (1.0), и у меня возникла проблема, когда изменение в модели Vue не отражается в DOM.

Элементы в выпадающем списке должны быть объектом, но после выбора я пытаюсь изменить значение свойства / выпадающего списка на значение int.

Я делаю это с помощью события watch, которое обрабатывает необходимую информацию из объекта, затем использует $set в свойстве, чтобы установить для него требуемый int.

Используя инструменты разработчика VueJS Chrome, я вижу, что изменение отражено в свойстве компонента, но при отправке формы оно публикуется в виде строки [object Object] , как будто DOM никогда не обновлялся.

Вот соответствующий выпадающий список в шаблоне:

 <select :disabled="releases.length amp;< 1" v-model="release" options="releases" class="form-control input-sm" name="{{formname}}[release_id]">
    <option selected="selected" value="">Choose Release...</option>
    <option v-for="obj in releases" v-bind:value="obj">{{obj.text}}</option>
</select>
  

И вот событие просмотра:

 "release": function() {
   this.$parent.$data.promos = this.release.promos;
   this.$set('release', this.release.id);
}
  

После изменения выпадающего списка обновляется promos свойство root, и, согласно инструментам разработки, release свойству компонента правильно присваивается значение id

Скриншот инструментов разработки

Но когда форма отправлена, я просто получаю строковое представление объекта!

ОПУБЛИКОВАТЬ скриншот

Кто-нибудь знает, что я здесь делаю не так; или это ошибка VueJS / есть ли обходной путь?

Спасибо!

Ответ №1:

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

Но у меня есть альтернативная реализация каскадного выпадающего списка для вас здесь:https://jsfiddle.net/mani04/Lgxrcc5p/1 /

Вы можете посмотреть, предоставляет ли это какие-либо указания. В этом примере используется Vue 2.0.3

В приведенном выше примере вашего кода я конкретно не понимаю эту часть:

 <select :disabled="releases.length amp;< 1" ...
  

Это ошибка копирования-вставки? Я надеюсь, что у вас в редакторе есть следующий код:

 <select :disabled="releases.length < 1" ...
  

Ответ №2:

Атрибут value параметра может быть привязан к объекту в Vue, но браузеру все равно необходимо отобразить значение как допустимый HTML, чтобы объект был преобразован в строку.

Единственное, что вы можете сделать, это добавить скрытое поле в форму со значением, равным идентификатору выбранного объекта release.


Редактировать: Другим вариантом может быть переопределение toString метода прототипа класса для возврата идентификатора объекта.

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

1. Спасибо за ответ! Я знаю, что не могу опубликовать объект, поэтому я затем вызываю $set: this.$set('release', this.release.id); который всегда будет целым числом. Не следует ли VueJS затем обновить значение <select> этим?

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