将summernote与vuejs一起使用

时间:2016-09-20 14:41:26

标签: javascript jquery vue.js summernote rubaxa-sortable

我尝试使用下一个功能创建待办事项列表:

  1. 可排序的项目
  2. 每个项目中的WYSIWYG编辑器
  3. 在todos模型中项目编辑器商店中的每个更改
  4. 我做了1和2但是不能做3.我只能更改任务数组中第一个任务的标题

    这是我的代码

    app.js

    Vue.directive('summernote', {
      bind: function() {
        this.editor = $(this.el).summernote({
          airMode: true,
          disableDragAndDrop: true,
          popover: {
            air: [
              ['style', ['bold', 'italic', 'underline', 'clear']]
            ]
          },
          callbacks: {
            onChange: function(contents, $editable) {
              vm.tasks[0].title = contents;
            }
          }
        });
      }
    });
    
    var vm = new Vue({
      el: '#todos',
    
      ready: function (value) {
        Sortable.create(this.$el.firstChild, {
          draggable: 'li',
          animation: 500,
          onUpdate: function(e) {
            var oldPosition = e.item.getAttribute('data-id');
            var newPosition = this.toArray().indexOf(oldPosition);
            vm.tasks.splice(newPosition, 0, vm.tasks.splice(oldPosition, 1)[0]);
          }
        });
      },
    
      data: {
        tasks: [
          { title: 'First task', done: true },
          { title: 'Second task', done: true },
          { title: 'Third task', done: false }
        ],
        newTask: '',
        editTask: null
      },
    
      methods: {
        addTask (e) {
          e.preventDefault();
          this.tasks.push({ title: this.newTask, done: false });
          this.newTask = '';
        },
    
        removeTask (index) {
          this.tasks.splice(index, 1);
        }
      }
    })
    

    的index.html

        <div class="container">
        <div id="todos"><ul class="list-group">
            <li
                v-for="task in tasks"
                class="list-group-item"
                data-id="{{$index}}"
                >
              <span
                    @click="task.done = !task.done"
                    class="glyphicon glyphicon-ok"
                    ></span>
                    <div v-summernote>{{ task.title }}</div>
              <span @click="removeTask($index)" class="close">&times;</span>
            </li>
        </ul>
    
        <form @submit="addTask">
          <input v-model="newTask" class="form-control" type="text" placeholder="Add some task">
        </form>
        <div v-summernote></div>
        <pre>{{tasks | json}}</pre>
        <pre>{{editor}}</pre>
      </div>
    </div>
    

    如何在每个项目中编辑和保存summernote的内容?这工作正常example

1 个答案:

答案 0 :(得分:2)

我认为首选的方法是构建一个组件(或使用an existing one),这将有道具等。但事实证明,内部属性为this您可以使用的指令:_scope。它在terminal directive example中记录(至少提到)。

你的绑定功能变为:

bind: function() {
  const scope = this._scope;
  this.editor = $(this.el).summernote({
    airMode: true,
    disableDragAndDrop: true,
    popover: {
      air: [
        ['style', ['bold', 'italic', 'underline', 'clear']]
      ]
    },
    callbacks: {
      onChange: function(contents, $editable) {
        scope.task.title = contents;
      }
    }
  });
}