代码之家  ›  专栏  ›  技术社区  ›  Peter

如何在Vuetify文本字段中获取键和值?

  •  0
  • Peter  · 技术社区  · 4 年前

    我在前端使用Vuetify,在后端使用Laravel。我试图创建一个动态表,用户可以在其中自己设置列名。因此,我创建了一个窗体,其中包含两个字段的循环:

    <template>
        <div>
            <v-card>
                <v-card-text>
                    <v-row v-for="n in numTextFields" align="center">
                        <v-col> <h3> Text {{ n }} </h3> </v-col>
                        <v-col> <v-text-field label="Bezeichnung" v-model="form.text.name[n]" > </v-text-field> </v-col>
                        <v-col> <v-switch label="Erforderlich" value="1" v-model="form.text.required[n]"></v-switch></v-col>
                        <v-col>Info</v-col>
                    </v-row>
                    {{ form }}
                </v-card-text>
            </v-card>
    </div>
    </template>
    
    <script>
    export default {
    name: "SmartTableColumnSetting",
        data() {
            return {
                numTextFields: 10,
                form: {
                    text: {
                        name: [],
                        required: []
                    }
                }
            }
        },
    }
    </script>
    

    这给出了以下示例:

    { "text": { "name": [ null, "Input Text 1", null, null, null, null, null, "Input Text 7" ], "required": [ null, null, null, null, "1", null, "1" ] } }
    

    我想要:

    {"text": {
       "type_1 :{
           text: "Input Text 1"
           required: 1
        },
       "type_2 :{
           text: "Input Text 2"
           required: 2
        },
    
       //and so on till 10
    }
    

    这可能吗?

    或者我需要更改后端中的值吗?

    正确的设置是什么?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Dan    4 年前

    不能对尚不存在的对象设置属性,模板不应创建这些对象。但您可以使用计算格式:

    computed: {
      formatted() {
        const results = { text: {} };
        for (let i = 0; i < this.numTextFields; i++) {
          results.text['type_' + (i + 1)] = {
            text: this.form.text.name[i],
            required: this.form.text.required[i],
          }
        }
        return results;
      }
    }
    

    在模板中,还需要使用 n-1 由于数组从0开始,但计数从1开始:

    v-model="form.text.name[n-1]"
    v-model="form.text.required[n-1]"
    

    演示:

    new Vue({
      vuetify: new Vuetify(),
      el: "#app",
      name: "SmartTableColumnSetting",
      data() {
        return {
          numTextFields: 10,
          form: {
            text: {
              name: [],
              required: []
            }
          }
        }
      },
      computed: {
        formatted() {
          const results = { text: {} };
          for (let i = 0; i < this.numTextFields; i++) {
            results.text['type_' + (i + 1)] = {
              text: this.form.text.name[i],
              required: this.form.text.required[i],
            }
          }
          return results;
        }
      }
    })
    <div id="app">
      <v-app>
        <v-main>
          {{ formatted }}
          <div>
            <v-card>
              <v-card-text>
                <v-row v-for="n in numTextFields" align="center" :key="n">
                  <v-col> <h3> Text {{ n }} </h3> </v-col>
                  <v-col> <v-text-field label="Bezeichnung" v-model="form.text.name[n-1]" > </v-text-field> </v-col>
                  <v-col> <v-switch label="Erforderlich" value="1" v-model="form.text.required[n-1]"></v-switch></v-col>
                  <v-col>Info</v-col>
                </v-row>
                {{ form }}
              </v-card-text>
            </v-card>
          </div>
        </v-main>
      </v-app>
    </div>
    
    
    <link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/@mdi/font@4.x/css/materialdesignicons.min.css" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>