选择 2 标记移动到上一行

Posted

技术标签:

【中文标题】选择 2 标记移动到上一行【英文标题】:Select 2 markup moving to previous row 【发布时间】:2020-01-30 16:12:27 【问题描述】:

我有一个 vuejs 应用程序,它遍历一个数组并输出大量 select2 元素。每个元素旁边都有一个删除按钮。当其中一个元素被删除时,会出现错误/故障,这意味着先前的 select2 值将应用于前一行。

这是一个演示:https://jsfiddle.net/3oqsmw0z/1/

我按如下索引删除项目:

deleteItem: function(index) 
    console.log('deleteItem');
    this.mySelects.splice(index, 1);

复制问题

在第一个选择中选择第一个选项,在第二个选择中选择第二个选项,然后在第三个选择中选择第三个选项。现在,删除第二个选项。理论上它现在应该显示元素一和三(两个已被删除)。但它显示选择了第二个选项。您可以通过标签看到它是第三个元素,如果您查看控制台中的标记,它就是第三个元素。为什么显示第二个选择的选项?

【问题讨论】:

【参考方案1】:

实际上,当您删除第二个元素时,会再次设置第三个元素的值。所以值观察者处理程序被执行。在您的处理程序中,您尝试使用 jQuery 设置值:

watch: 
    value: function (value) 
      // update value
      $(this.$el).val(value)
    ,...

但它不起作用,因为此操作不会触发 change 事件。所以 Vue 不会渲染任何变化。

要修复它显式触发change 事件:

 watch: 
    value: function (value) 
      // update value
      $(this.$el).val(value).trigger('change')
    ,...

我还在您的演示中注意到您的 select 元素未正确初始化。你通过了:

mySelects: [
      label: 'first', val: 1,
      label: 'second', val: 2,
      label: 'third', val: 3
    ],...

因此,在第一个 select 中必须选择值 1,在第二个中 - 值 2 等等。

修复它有两个步骤:

    设置值后显式触发change事件 通过选项后设置值
 mounted: function () 
    var vm = this
    $(this.$el)
    // first pass the options
      .select2( data: this.options )
    // and then set the value
      .val(this.value)
    // trigger change event explicitly to let Vue know that it has to update DOM
      .trigger('change')
    // emit event on change.
      .on('change', function () 
        vm.$emit('input', this.value)
      )
  ,

【讨论】:

谢谢,我需要搞乱更改事件等吗?除了删除某些内容之外,一切都运行良好。 是的,你知道。否则,当值以编程方式更改时(例如在删除的情况下),您将遇到问题。您的 v-model 绑定将无法正常工作。在article 中,他们说:如果 jQuery 对 Vue 管理的元素进行更改,Vue 将不会意识到更改,并且会继续并在下一个更新周期中覆盖它。另请参阅 Vue.js 的 Wrapper Component Example。

以上是关于选择 2 标记移动到上一行的主要内容,如果未能解决你的问题,请参考以下文章

IOS辅助功能选择的标记不移动

Intellij IDEA 移动到上一个光标处 用哪个快捷键

JAVA中的JTable如何在显示的时候默认选择到第一行

css的select的option ,鼠标移动到上面的蓝色怎么修改

快捷键让你成为不用鼠标的程序员

单行数组排序选择排序