Получатель / установщик класса JavaScript и v-модель в VueJS

Я создал класс формы, в котором я установил несколько геттеров и сеттеров для каждого поля, которое может иметь форма.

В геттерах и сеттерах я пишу и получаю доступ к хранилищу Vuex:

Функция init () - это то место, где я установил g / s.

export class Form {

    /**
     * @param data
     */
    constructor(data) {

        this.init(data);

        this.errors = new Errors();

    }

    /**
     * initially set up the getters/setters properties for the fields
     * @param data
     */
    init(data) {


        for (const propertyData in data) {

            if (data.hasOwnProperty(propertyData) && !Form.isPrototypeOf(propertyData)) {

                Object.defineProperty(Form.prototype, propertyData, {

                    get: function () {

                        return store.state.form[propertyData];

                    },

                    set: function (value) {

                        store.commit('set', {field: propertyData, value: value});
                    },

                });

            }
        }

    }


    /**
     * set the properties , also setup new setters/getters if new props where added
     * @param data
     * @returns Object {Form}
     */
    fill(data) {


        for (let field in data) {
            if (data.hasOwnProperty(field)) {
                this[field] = data[field];
            }
        }

        return this;
    }


    reset() {
        store.commit('reset');

        return this;
    }

    data() {

        return store.state.form;
    }
}

Это отлично работает, когда у меня есть ввод и привязка form.name, например это написано в Vue Storge.

и когда я делаю console.info в этой form.name, он показывает изменения

...
        methods: {
            test() {
              console.info(this.form.name);
            },
...

То, что я заметил, и это на самом деле моя проблема и вопрос.

когда я делаю {{form.name}} под вводом, например, это не обновляется, как должно, и я не уверен, почему?

Обновлено:

после обратной связи от @Jacob Goh и некоторого взлома моей проблемы кажется, что я нашел решение:

init(data) {


    for (let propertyData in data) {

        this[propertyData + '_i'] = data[propertyData];

        if (data.hasOwnProperty(propertyData) && !Form.prototype.hasOwnProperty(propertyData)) {

            Object.defineProperty(Form.prototype, propertyData, {

                get: function () {

                    this[propertyData + '_i'] = store.state.form[propertyData];

                    return this[propertyData + '_i'];

                },

                set: function (value) {

                    this[propertyData + '_i'] = value;

                    store.commit('set', {field: propertyData, value: value});
                },

            });

        }

    }

}

переменная в vue, а также в журнале консоли, кажется, обновляется правильно. Я не совсем уверен в том, что происходит.

Я предполагаю, что я добавлю новые свойства к объекту с помощью _i, поэтому vue подумал, что ему нужно настроить кучу новых наблюдателей.

Надеюсь, кто-нибудь сможет это прояснить.

Могу я узнать, почему вы так поступили? Все было бы намного проще, если бы вы использовали параметры Vue (данные, вычисление, методы).

Jacob Goh 25.04.2018 09:26

Я хотел, чтобы мои поля были заключены в класс / объект формы или что-то еще, поэтому я мог просто отправить его, а также обработать ошибки.

therabbityouknow 25.04.2018 09:28
Каждые реактивные данные во Vue имеют свой собственный геттер, сеттер.. Согласно vuejs.org/v2/guide/reactivity.html#How-Changes-Are-Tracked, установщик отвечает за уведомление наблюдателя о том, что произошло изменение и что DOM должен быть обновлен. form.name имеет собственный сеттер, работающий вне Vue. Так что он не реагирует и не обновляется. Это всего лишь мои 2 цента. Я не знаю, как заставить эту работу работать, не делая что-то взломанное.
Jacob Goh 25.04.2018 10:05

Хм, теперь это проблема, спасибо за внимание.

therabbityouknow 25.04.2018 10:15

обновил мой вопрос с возможным решением

therabbityouknow 25.04.2018 13:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
1 067
0

Другие вопросы по теме