当 allowAdditions 为真时,从 SemanticUI 多选下拉列表中删除值时 V 模型不更新

V-model not updating while removing a value from SemanticUI multiselect dropdown when allowAdditions is true

当我们从语义 UI 多选搜索下拉列表中删除值时,V-model 不会更新。

如果我们输入下拉列表中不存在的任何值并按 enter/tab,则该值会正常添加到数组中,但当我们删除该值时,它不会从数组中删除。但是,如果我们删除从下拉选项中选择的任何值,它就可以正常工作。

这是我的代码:

new Vue({
  el: "#app",
  data: {
  lists:[]
  },
})
$('.ui.dropdown')
    .dropdown({
        allowAdditions: true,
    });
body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
}

li {
  margin: 8px 0;
}

h2 {
  font-weight: bold;
  margin-bottom: 15px;
}

del {
  color: rgba(0, 0, 0, 0.3);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.css" />

<div id="app">
  <h3>Selected values: {{lists}}</h3>
  <select name="skills" multiple="" v-model="lists" class="ui search fluid dropdown">
  <option value="">Skills</option>
  <option value="Angular">Angular</option>
  <option value="CSS">CSS</option>
  <option value="HTML">HTML</option>
</select>

</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.js"></script>

按照以下步骤重新创建示例:

  1. 点击下拉菜单查看选项
  2. Select 'Angular', 'CSS' 和 'HTML' 一一
  3. 选择后,在下拉菜单中输入'Abcd',然后按Tab键或回车(将创建此值的Pillbox)
  4. 现在你会在数组中看到 4 个值
  5. 通过单击删除 (x) 图标删除 'Angular' 和 'CSS' - 这些也会自动从数组中删除
  6. 现在删除 'Abcd' - 在我们添加或删除下拉列表中存在的任何值之前,它不会被删除。

有人可以帮忙吗?

我建议使用语义本身给出的 vue-semantics,因为像选项和选定值这样的接缝在后端被正确绑定,但同时这里有一个解决方法来加强这个用例。

只需使用 onRemove 回调从列表中删除未选中的元素。这将确保元素被成功删除。

new Vue({
  el: "#app",
  data: {
  lists:[],
    options : ["Angular", "CSS", "HTML"]
  },
  mounted: function(){
    $('.ui.dropdown').dropdown({
      allowAdditions: true,
      onRemove : (removedValue, removedText, $removedChoice) => {
        this.verifySelected(removedValue);
      }
    });
  },
  methods : {
    verifySelected : function(removedValue){
      var index = this.lists.indexOf(removedValue);
      if(index > -1){
          this.lists.splice(index, 1);
          console.log(this.lists);
      }

    }
  }
})