Bootstrap Vue阻止/取消事件

时间:2019-01-03 14:21:44

标签: typescript vue.js vuejs2 html-select bootstrap-vue

我有一个带有Bootstrap Vue中的b-form-select控件的页面。 当我更改此控件的值时,我想执行一个可以取消此事件且不更改值的函数。

为了使事情变得更复杂,我的选择位于子组件中,而我执行的功能位于父组件中。

子组件

public values: any[] = [
  { name: 'default'},
  { name: 'forbidden'},
  { name: 'other option' },
]

<b-form-select :value="property" @change="$emit('onPropertyChange', arguments[0])">
   <option v-for="(val, key) in values" :value="val" :key="key">{{val.Name}}</option>
</b-form-select>

父组件:

this.property = { name: 'default' }
public onPropertyChange(newValue) {
  if (newValue.name === 'forbidden') {
    // Not changing this.property
  } else {
    // Changing it
    this.property = newValue
  }     
}

<child :property="property" @onPropertyChange="onPropertyChange"></child>

当我在选择中选择“禁止”时。我看到选择框已更改为该值,但是子级属性和父级属性仍然具有旧值,这正是我想要的。我该如何选择旧值呢?

Bootstrap Vue在change事件上似乎没有prevent修饰符。 我也尝试使用本机事件,但是存在相同的问题。

我做错什么了吗?

1 个答案:

答案 0 :(得分:1)

禁用禁止的选项可能比使它们神秘地不选择选定的值更好,但是可以通过保存旧值并将其恢复到{{3} }。

请注意,您的options结构不适用于b-form-select。我进行了计算,可以制作正确的结构并处理设置disabled,并将其用于b-form-select

new Vue({
  el: '#app',
  data: {
    selected: 'default',
    options: [{
        name: 'default',
      },
      {
        name: 'forbidden'
      },
      {
        name: 'other option'
      },
      {
        name: 'what I had before'
      },
    ]
  },
  computed: {
    selectOptions() {
      return this.options.map((opt) => ({
        text: opt.name,
        value: opt.name,
        disabled: opt.name === 'forbidden'
      }));
    }
  },
  methods: {
    onChange(newValue) {
      const oldValue = this.selected;

      if (newValue === 'what I had before') {
        this.$nextTick(() => {
          this.selected = oldValue;
        });
      }
    }
  }
});
<script src="https://unpkg.com/vue@latest/dist/vue.js"></script>
<script src="https://unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.js"></script>
<div id="app">

  <b-form-select v-model="selected" :options="selectOptions" @change="onChange">
  </b-form-select>

  <div>Selected: <strong>{{selected}}</strong></div>

</div>