禁用当前选择,直到在前一个选择中输入了某个值

Posted

技术标签:

【中文标题】禁用当前选择,直到在前一个选择中输入了某个值【英文标题】:disable current selection until some value is inputed in the previous selection 【发布时间】:2021-12-01 15:30:41 【问题描述】:

我正在与BootstrapVue 合作。

我有以下问题。我有一个b-form-input,我在b-form-select 上搜索我的number。所以我选择了 3 个值并在我的输入字段和其他方式中获取一个数字 - 所以它是一个 自动填充

这很好用 - 因此我认为我不需要向您展示代码。

问题是我想禁用所有选择(而不是第一个),直到之前的字段被选中。

我有一个问题,如果我有多个元素,所有元素都会被更新。因此,如果我在第一个元素的Input1 中输入一些内容,那么所有其他元素中的第二个Input 将是!disabled

附加信息IDParent 是道具!

如果您需要任何其他代码,我可以更新我的问题!

<template>
  <div>
    <div class="mt-2" v-for="(IDChild, indexChild) in inputs" :key="indexChild">
      <div>
        <div class="mt-2">Number</div>
        <b-form-input type="number" v-model="IDChild.Number" :value="IDChild.Number"></b-form-input>
      </div>

      <div>
        <div class="mt-2">Input 1</div>
        <b-form-select v-model="IDChild.Input1" :value="IDChild.Input1" :options="optionsInput1" @input="searchNumber(IDChild, IDParent, indexChild)"></b-form-select>
      </div>
      <div>
        <div class="mt-2">Input 2</div>
        <b-form-select :disabled="disabledInput2" v-model="IDChild.Input2" :value="IDChild.Input2" :options="optionsInput2" @input="searchNumber(IDChild, IDParent, indexChild)"></b-form-select>
      </div>
      <div>
        <div class="mt-2">Input 3</div>
        <b-form-select :disabled="disabledInput3" v-model="IDChild.Input3" :value="IDChild.Input3" :options="optionsInput3" @input="searchNumber(IDChild, IDParent, indexChild)"></b-form-select>
      </div>
    </div>

    <!-- add new element when button was clicked -->
    <div class="mt-4 mb-5 ml-3 mr-3">
      <b-button @click="addElement"> Add Element </b-button>
    </div>
  </div>
</template>  

我的脚本:

<script>
import json from "./json/json.json";

export default 
  name: "Test",

  methods: 
    addElement() 
      this.inputs.push();
    ,

    searchNumber(input, IDParent, indexChild) 
      input.Number = "";

      this.json.forEach((element) => 
        if (
          element.Input1 == input.Input1 &&
          element.Input2 == input.Input2 &&
          element.Input3 == input.Input3 
        ) 
          for (const key of Object.keys(element)) 
            input[key] = element[key];
          
        
      );

      if(input.Input1) 
        this.disabledInput2 = false;
      
      if(input.Input2) 
        this.disabledInput3 = false;
      
    ,
  ,

  props: [
    "IDParent",
    ],

  data() 
    return 
      inputs: [],
      json: json,
      disabledInput2: true,
      disabledInput3: true,
    ;
  ,
;
</script>

【问题讨论】:

能否提供定义disabledInput2disabledInput3 的代码?如果我们不知道这些布尔值何时设置,我们不可能告诉你为什么它们会意外翻转 已更新 - 希望现在清楚了! 【参考方案1】:

您缺少的是数据的多层模型,您可以在 searchNumber 函数中调用它并调用您的 :disabled 属性。

在您的v-for="(IDChild, indexChild) in inputs" 中,您可以使用IDChildindexChild。例如,您可以拨打:disabled="disabledInput2[indexChild]"。这样您就可以使用特定的indexChild 来引用disabledInput2

你还需要在你的函数中处理这个,例如this.disabledInput2[indexChild] = false;

基本上它与使用v-model在同一个对象中存储多层数据相同。


编辑:一般示例

我为此示例创建了以下属性。我们将myNumberInput 作为一个对象来处理数字的多个输入字段。 mySelectionData 提供了两个对象的简单集合,每个对象有 3 个选择数组。 myDisableData 是将处理此选择的多个 disabled 属性的对象:

    myNumberInput: ,
    mySelectionData: 
        1: 
            1: [
                 name: "1A", value: 1 ,  name: "2A", value: 2 ,  name: "3A", value: 3 
            ],
            2: [
                 name: "4A", value: 4 ,  name: "5A", value: 5 ,  name: "6A", value: 6 
            ],
            3: [
                 name: "7A", value: 7 ,  name: "8A", value: 8 ,  name: "9A", value: 9 
            ]
        ,
        2: 
            1: [
                 name: "1B", value: 11 ,  name: "2B", value: 21 ,  name: "3B", value: 31 
            ],
            2: [
                 name: "4B", value: 41 ,  name: "5B", value: 51 ,  name: "6B", value: 61 
            ],
            3: [
                 name: "7B", value: 71 ,  name: "8B", value: 81 ,  name: "9B", value: 91 
            ]
        
    ,
    myDisableData: 

mySelectionData 对象,我们将使用这个函数构建我们的myDisableData

setupMyDisableData() 
      Object.keys(this.mySelectionData).forEach(parent_key => 
        Object.assign(this.myDisableData, [parent_key]: )
        Object.keys(this.mySelectionData[parent_key]).forEach(child_key => 
          Object.assign(this.myDisableData[parent_key], [child_key]: true)
        );
      );
    

这将通过我们的“父母”循环,将他们的index 分配给myDisableData,并通过“孩子”循环并将他们的index 分配给myDisableData,其中“父母”-index 作为指针。之后我们就有了一个多层对象,它能够为每个选择提供diabled=truefalse

此示例的 html 如下所示:

<div v-for="(item,index) in mySelectionData" :key="index">
        <input type="number" v-model="myNumberInput[index]" @input="enableMySelection(index, myNumberInput[index])">
        <div v-for="(child_item, child_index) in item" :key="child_index">
          <select :disabled="myDisableData[index][child_index]">
            <option v-for="(child_option, child_option_index) in child_item" :key="child_option_index" :value="child_option.value">child_option.name</option>
          </select>
        </div>
      </div>

因为我不使用BootstrapVue,所以我的 html 看起来不同,但我想你会明白的。您现在只需通过“父”和“子”的index 来引用这三个对象。在此示例中,函数enableMySelection 将根据在input 中输入的数字启用选择。函数如下所示:

enableMySelection(parent_index, input_number) 
      Object.keys(this.myDisableData[parent_index]).forEach(child_key => 
        this.myDisableData[parent_index][child_key] = true;
      );
      this.myDisableData[parent_index][input_number] = false;
    

因此,如果您在第一个输入中输入“2”,它将启用第一个块的第二个选择。如果您在第二个输入中输入 1,它将启用第二个块中的第一个选择。

正如我所说,这只是一个一般性示例,但这应该足以帮助您定义结构以处理您的多个输入和选择。

【讨论】:

您好,感谢您尝试帮助我! - 我已将所有内容更改为this.disabledInputX[indexChild],但现在所有内容都已启用 - 我认为这是因为我的data - 我应该如何将它写在那里?因为从逻辑上讲disabledInputX[indexChild]: true 是行不通的.. @B0BBY 目前你有disabledInput2: true,但它需要是一个对象或数组来存储数据。由于我不知道您的数据结构并且不使用BootstrapVue,因此我用一个一般示例编辑了我的答案。

以上是关于禁用当前选择,直到在前一个选择中输入了某个值的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用提交按钮,直到所有文本字段都已满并选择文件

Wordpress COD 选项禁用,直到输入城市

时间选择器禁用当前时间之前的时间

禁用 TextBox 样式中的文本选择

jQuery - 基于另一个字段选择值禁用输入字段

修改颜色选择器面板