【问题标题】:How to bind a sortable list to vuejs?如何将可排序列表绑定到 vuejs?
【发布时间】:2016-05-30 09:21:05
【问题描述】:

我正在尝试在Vue.js中绑定一个可排序的列表,但是底层数据列表没有更新:

Vue.component('lessons', {
  template: "#lessons-template",

  data: function() {
    return {
      list: ['Item 1', 'Item 2', 'Item 3']
    };
  },

  methods: {
    onChange: function(evt) {
      console.log(this.list); // allways ['Item 1', 'Item 2', 'Item 3']
    }
  },

  ready: function(value) {
    Sortable.create(this.$els.sortable, {
      draggable: 'li',
      onSort: this.onChange
    });
  }
});

new Vue({ el: 'body'});
ul { list-style: none;}
ul li { padding: 10px; display: block; background: #EFEFEF; margin-bottom: 5px;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.16/vue.js"></script>
<script src="http://rubaxa.github.io/Sortable/Sortable.js"></script>

  <div>
    <lessons></lessons>
  </div>

  <template id="lessons-template">

    <ul v-el:sortable>
      <li v-for="item in list">{{ item }}</li>
    </ul>
    
    <pre>{{ list | json }}</pre>
  </template>

【问题讨论】:

    标签: data-binding vue.js


    【解决方案1】:

    我们开始吧:

    Vue.js:

    Vue.component('lessons', {
      template: "#lessons-template",
    
      data: function() {
        return {
          list: ['Item 1', 'Item 2', 'Item 3']
        };
      },
    
      methods: {
        onChange: function(evt) {
          console.log(this.list); // allways ['Item 1', 'Item 2', 'Item 3']
        }
      },
    
      ready: function(value) {
        var self = this;
        Sortable.create(this.$els.sortable, {
          draggable: 'li',
          onSort: this.onChange,
          onEnd: function (evt) {
            self.list.splice(evt.oldIndex,1);
            self.list.splice(evt.newIndex,0,evt.item.id);       
        },
        });
      }
    });
    
    new Vue({ el: 'body'});
    

    HTML:

    <div>
        <lessons></lessons>
    </div>
    
    <template id="lessons-template">
       <ul v-el:sortable>
         <li v-for="item in list" id="{{item}}">{{ item }}</li>
        </ul>
    </template>
    

    工作 Vue.js 可排序的 jsFiddle:https://jsfiddle.net/crabbly/vhsd3wwu/

    【讨论】:

    • 我有一个问题,当我拖动它时它的行为就像它没有绑定一样,只有在我释放/放置项目后才绑定。这对我来说是个问题,因为我在后台进行 AJAX 调用,当我得到更新时,Vue 会插入一个新元素,所以我有重复项
    • @ErikBerkun-Drevnig 你的 ajax 调用一定有问题,或者很可能是你在哪里运行它们。基本上,你会在更新时运行你的 ajax 调用,否则什么都没有改变,也不需要任何调用。这应该很简单。如果您创建一个复制场景的小提琴,我可能会为您确定问题。
    • 我这样做是为了如果列表被其他客户更改,我可以得到更新。这不是正确的做法吗?
    • 你的小提琴不起作用(Window 10,最新的 Chrome)
    • @Sebi2020 可排序库的 url 似乎不再可用。
    猜你喜欢
    • 2020-02-23
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 2014-07-29
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多