Как создать простой модал для создания и редактирования функций в vue.js? - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь создать модель, чтобы иметь возможность редактировать существующие данные? Как мне это сделать?

Я использую <el-form>, чтобы создать новую запись, в этом случае я создаю вопросы, я хочу использовать это для редактирования и получить данные иззапись добавлена ​​в форму.

Это моя форма прямо сейчас

<el-dialog title="Nuevo" :loading="loading" :visible="dialogFormVisible" :visible.sync="dialogFormVisible">

    <el-form label-position="top" ref="form" :model="form" :rules="rules">
        <el-row>
            <el-form-item label="Pregunta" prop="question">
                <el-input v-model="form.question"></el-input>
            </el-form-item>
        </el-row>
        <el-row>
            <el-col :span="8">
                <el-form-item label="Seccion" prop="survey_section_id">
                    <el-select v-model="form.survey_section_id" placeholder="Selecionar">
                        <el-option v-for="section in survey_section" :key="section.id" :label="section.title"
                            :value="section.id">
                        </el-option>
                    </el-select>
                </el-form-item>
            </el-col>
            <el-col :span="8">
                <el-form-item label="Tipo de Respuesta" prop="response_type">
                    <el-select v-model="form.response_type_id" placeholder="Selecionar">
                        <el-option v-for="type in response_type" :key="type.id" :label="type.type" :value="type.id">
                        </el-option>
                    </el-select>
                </el-form-item>
            </el-col>
            <el-col :span="4">
                <el-form-item label="Opcional" prop="optional">
                    <el-switch v-model="form.optional"></el-switch>
                </el-form-item>
            </el-col>
        </el-row>
    </el-form>
    <span slot="footer">
        <el-button type="info" @click="dialogFormVisible = false">Cancelar
        </el-button>
        <el-button type="primary" :loading="loading" @click="submit('form')">Guardar
        </el-button>
    </span>
</el-dialog>

Что мне нужно сделать, чтобы превратить это в модальное и использовать его также для моего редактирования?

Спроси меня что угодно, я могу предоставить любой нужный мне код. Спасибо

1 Ответ

2 голосов
/ 07 октября 2019

Это распространенная проблема. Конечно, многие из этих вещей сводятся к личным предпочтениям или мнению, но вот несколько вещей, которые следует учитывать:

  1. Обычно при решении этой проблемы вы отображаете все свои существующие моделикаким-то образом (то есть списком), с кнопкой «редактировать». Когда я делаю это, я использую объект, который сопоставляет идентификаторы модели с соответствующими им объектами модели в качестве базовой модели данных для этого списка. Это позволяет легко заменить модель на обновленную версию (models[model.id] = model).

  2. Привязка модели к форме напрямую (например: модель = "модель, которую вы хотите редактировать") обычно плохая реализация. Это связано с тем, что любые изменения, сделанные во время редактирования, будут немедленно записаны в модель. Проблема в том, что если ваша функция save() не работает, вам нужно все вернуть обратно. Лучшая реализация - клонировать модель и связать , который объект с формой.

  3. Вы можете использовать вычисленное свойство для модальныхназвание / заголовок. У меня обычно есть свойство данных с именем mode, которое будет либо «Создать», либо «Редактировать», а затем у меня есть вычисляемое свойство, которое возвращает mode + ' Model', где «Модель» - это имя модели - в вашем случае, "Pregunta".

  4. Поскольку функции create и update обычно используют разные конечные точки API (и методы HTTP), ваша кнопка "Сохранить / Обновить" должна вызватьправильный. Опять же, я использую свойство mode, чтобы справиться с этим (например, <button @click="mode == 'edit' ? update : save">)


Следующий код должен дать вам хорошую отправную точку для того, чтобы иметь модальное, которое вы можетеиспользуется для создания и редактирования моделей, а также базовой структуры для большинства CRUD компонентов.

<template>
  <div>
    <template v-for="model in modelsArray">
      ... <!-- Display your existing models however you want -->
      <a href="" @click.prevent="edit(model)">Edit</a>
    </template>
    <button @click="create">Create New Model</button>
    <el-dialog
      :title="modalTitle"
      :loading="loading"
      :visible.sync="dialogFormVisible"
    >
      <el-form :model="formModel">
        ...
      </el-form>
      <span slot="footer">
        <el-button type="info" @click="cancel">Cancelar</el-button>
        <el-button
          type="primary"
          :loading="loading"
          @click="mode == 'edit' ? update : save"
        >
          {{ mode }}
        </el-button>
      </span>
    </el-dialog>
  </div>
</template>

<script>
export default {
  data() {
    mode: '',
    dialogFormVisible: false,
    loading: false,
    formModel: {},
    models: {            // an object mapping your existing model IDs
      1: { id: 1, ...},  // to their corresponding model objects
      2: { id: 2, ...},
      3: { id: 3, ...},
      ...
    }
  },
  ...,
  computed: {
    modelsArray() {
      return Object.values(this.models);
    },
    modalTitle() {
      return `${ this.mode } Model`;
    }
  },
  methods: {
    create() {
      this.mode = 'Create';
      this.dialogFormVisible = true;
    },
    edit(model) {
      this.mode = 'Edit';     
      this.formModel = _.cloneDeep(model); // See note below
      this.dialogFormVisible = true;
    },
    save() {
      // POST the new model (this.formModel) to your server using your ajax library of choice     
      // after the ajax call returns, do the following:
      this.models.push(the newly created model); // usually returned from the server as part of this ajax call
      this.reset();
    },
    update() {
      // PUT the new model (this.formModel) to your server using your ajax library of choice
      // After the ajax call returns, replace the updated model in the `models` object, and reset the form:
      this.models[this.formModel.id] = _.cloneDeep(this.formModel);
      this.reset();
    },
    reset() {
      this.dialogFormVisible = false;
      this.loading = false;
      this.formModel = {
        ... // put default form values here
      };
    }
  },
  mounted() {
    this.reset();
  }
}
</script

ПРИМЕЧАНИЕ: _.cloneDeep от Лодаша. Если вы не используете lodash, вы можете использовать один из этих методов для клонирования модели.

...