在 vuejs 中使用 summernote
Use summernote with vuejs
我尝试创建具有以下功能的待办事项列表:
- 可排序的项目
- 每个项目中的所见即所得编辑器
- 待办事项模型中项目的编辑器商店的每个更改
我做了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">×</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
我认为首选方法是构建一个组件(或使用 an existing one), which would have props, etc. However, it turns out that there is an internal property of this
inside the directive that you can use: _scope
. It is documented (well, mentioned at least) in the 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;
}
}
});
}
我尝试创建具有以下功能的待办事项列表:
- 可排序的项目
- 每个项目中的所见即所得编辑器
- 待办事项模型中项目的编辑器商店的每个更改
我做了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">×</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
我认为首选方法是构建一个组件(或使用 an existing one), which would have props, etc. However, it turns out that there is an internal property of this
inside the directive that you can use: _scope
. It is documented (well, mentioned at least) in the 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;
}
}
});
}