我在vue组件中添加了jquery redactor插件。该插件工作正常但我需要访问html所以我可以在Vue中看到它。
我已经尝试了我能想到的一切,方法,计算属性,但我找不到办法。它特别棘手,因为Redactor在dom中添加了新的html,我需要从添加的html中获取数据。
目前我收到此错误this.$emit is not a function
。我需要将.redactor-editor
的html值放入道具中,以便在vue数据中可用。 var textContent
在控制台中正确打印出来但我无法在prop
中显示。非常感谢任何帮助。
组件
<template>
<div>
<textarea class="form-control question-create-editor" id="question_description" placeholder="Go wild with all the details here - make image upload work" rows="3">
</div>
</template>
<script>
export default {
props: ['redactorValue'],
mounted: function(){
$('#question-create-form .question-create-editor').redactor({
imageUpload:'/urlGoesHereBro/',
plugins: ['video', 'imagemanager', 'counter', 'limiter'],
buttonsHide:['html', 'formatting', 'deleted', 'indent', 'outdent', 'alignment', 'horizontalrule']
});
},
computed: {
redactorValue: function(){
$('#question-create-form .redactor-editor').on('keyup', function(){
var textContent = $('#question-create-form .redactor-editor').html();
console.log( 'textContent = ' + textContent );
this.$emit('redactorValue', textContent);
});
}
}
};
HTML
<vueredactor></vueredactor>
答案 0 :(得分:2)
this.$emit is not a function
问题是因为this
指向window
。
我还将keyup
定义移到mounted
。
export default {
data(){
return {
redactorValue: null
}
},
mounted: function(){
$('#question-create-form .question-create-editor').redactor({
imageUpload:'/urlGoesHereBro/',
plugins: ['video', 'imagemanager', 'counter', 'limiter'],
buttonsHide:['html', 'formatting', 'deleted', 'indent', 'outdent', 'alignment', 'horizontalrule']
});
$('#question-create-form .redactor-editor').on('keyup', function(){
this.redactorValue = $('#question-create-form .redactor-editor').html();
}.bind(this));
}
};
答案 1 :(得分:1)
只需添加@BertEvans精湛的答案。这是一个将道具和v模型添加回混合的解决方案。这允许您将redactor内容作为值获取并可以在根目录中访问该数据。
<强>组件强>
<template>
<div>
<textarea class="form-control question-create-editor" id="question_description" placeholder="Go wild with all the details here - make image upload work" rows="3">
</div>
</template>
<script>
export default {
props: ['value'],
data(){
return {
redactorValue: null
}
},
mounted: function(){
$('#question-create-form .question-create-editor').redactor({
imageUpload:'/urlGoesHereBro/',
plugins: ['video', 'imagemanager', 'counter', 'limiter'],
buttonsHide:['html', 'formatting', 'deleted', 'indent', 'outdent', 'alignment', 'horizontalrule']
});
$('#question-create-form .redactor-editor').on('blur', function(){
this.redactorValue = $('#question-create-form .redactor-editor').html();
this.$emit('input', this.redactorValue);
}.bind(this));
}
};
</script>
<强> JS 强>
Vue.component('vueredactor', require('./components/redactor.vue'));
var App = new Vue({
el: '#app',
data: {
redactorContent: null
}
});
<强> HTML 强>
<div id="app>
<vueredactor v-model="redactorContent"></vueredactor>
</div>
答案 2 :(得分:1)
这是我使用Imperavi的Redactor Editor 3运行的VueJS 2组件。 在同一视图中支持多编辑器,但编辑器需要唯一的名称/ ID。 不需要jQuery库。
RedactorEditor.vue
<template>
<div class="redactor">
<textarea ref="redactorContainer" :id="id" :value="value"></textarea>
</div>
</template>
<script>
import 'addons/redactor/css/redactor.css'
import 'addons/redactor/redactor'
//import 'addons/redactor/plugins/wordslimiter/wordslimiter'
//import 'addons/redactor/plugins/beyondgrammar/beyondgrammar'
export default {
name: 'redactor-editor',
props: {
value: {
required: true,
twoWay: true
},
id: {
type: String,
default: 'editor'
},
minHeight: {
type: String,
default: '300px',
},
maxHeight: {
type: String,
default: '800px',
},
buttons: {
type: Array,
default: () => ['html', 'format', 'bold', 'italic', 'deleted', 'lists', 'link']
},
plugins: {
type: Array,
default: () => []
},
wordslimiter: {
type: Number,
default: 0
},
beyondgrammarSettings: {
type: Object,
default: null
}
},
data () {
return {
propValue: this.value
}
},
created () {
this.isChanging = false;
this.app = null;
},
mounted () {
var me = this;
this.app = $R(this.$refs.redactorContainer, {
style: true,
breakline: false,
shortcodes: false,
pasteClean: true,
autoparseImages: false,
autoparseVideo: false,
multipleUpload: false,
clipboardUpload: false,
pasteLinkTarget: '_blank',
placeholder: 'Write your text here ...',
minHeight: this.minHeight,
maxHeight: this.maxHeight,
buttons: this.buttons,
plugins: this.plugins,
wordslimiter: this.wordslimiter,
beyondgrammar: this.beyondgrammarSettings,
callbacks: {
start: function() {
// set initial data
this.source.setCode(me.propValue);
},
blur: function (e) {
// keyup not work with last typed text, fix sync with v-model by using blur
if (!me.isChanging) {
me.isChanging = true;
var code = this.source.getCode()
me.propValue = (code === null || code.length === 0 ? null : code);
me.$emit('input', me.propValue);
me.$nextTick(function() {
me.isChanging = false;
});
}
}
}
})
},
destroyed () {
this.app = $R(this.$refs.redactorContainer)
if (this.app) {
this.app.destroy()
}
}
};
</script>
App.vue
import Vue from 'vue'
import RedactorEditor from './components/RedactorEditor.vue'
// app
const app = new Vue({
el: '#my-app',
data: {
editorButtons: ['undo', 'redo', 'bold', 'italic', 'lists', 'link'],
editorPlugins: [],
beyondgrammarSettings: {}
editorHTMLContent: '',
},
components: {
RedactorEditor
}
}
HTML使用情况
<redactor-editor
v-model="editorHTMLContent"
:text-value="editorHTMLContent"
:id="'editor_1"
:name="'editor_1"
:plugins="editorPlugins"
:buttons="editorButtons"
></redactor-editor>
使用vee-validate的自定义验证程序的示例:https://gist.github.com/matinfo/52214f7f34ce6b746b483f0f92e6b5e5