angular 5 和 quilljs [羊皮纸] 无法创建印迹
angular 5 and quilljs [Parchment] Unable to create blot
我正在与 primeng editor and there is no any problem with editor itself, however I'm fighting two days in a row with extending standard block for custom tag, official documentation says for any additional feature to use quilljs api
合作
我检查了每个 api 和 github 上的问题,在我看来,我的方法是正确的,但我无法摆脱这个恼人的错误:
ERROR Error: [Parchment] Unable to create marker blot
at new ParchmentError (scripts.bundle.js:148)
at Object.create (scripts.bundle.js:178)
at BlockBlot.insertAt (scripts.bundle.js:7323)
at Block.insertAt (scripts.bundle.js:855)
at Scroll.ContainerBlot.insertAt (scripts.bundle.js:3404)
at ScrollBlot.insertAt (scripts.bundle.js:7060)
at Scroll.insertAt (scripts.bundle.js:4252)
at Editor.insertEmbed (scripts.bundle.js:2606)
at scripts.bundle.js:1379
at Quill.modify (scripts.bundle.js:1610)
我想要实现的是添加自定义标签,其中包含不可编辑的内容。这是我的代码:
...
import {Editor} from 'primeng/editor';
import * as Quill from 'quill';
import * as Parchment from 'parchment';
const Block = Quill.import('blots/block/embed');
class BlockEmbed extends Parchment.default.Embed {}
BlockEmbed.prototype = Block.prototype;
export class Variable extends BlockEmbed {
static blotName = 'marker';
static tagName = 'marker';
static create(value: any) {
console.log(value);
const node = (super.create(value) as any);
node.innerHTML = '<span contenteditable=false>' + value + '</span>';
node.setAttribute('contenteditable', false);
return node;
}
}
Variable.blotName = 'marker';
Variable.tagName = 'marker';
Quill.register('formats/marker', Variable);
@Component({
selector: 'manager',
templateUrl: './manager.component.html',
styleUrls: ['./manager.component.css']
})
export class ManagerComponent implements OnInit, AfterViewInit {
private quill: any;
@ViewChild(Editor) editorComponent: Editor;
ngOnInit() {}
// based on primeng github issue this how we can get references to quill
ngAfterViewInit() {
this.quill = this.editorComponent.quill;
}
variableSelected(event) {
// grubbing string variable from event
this.quill.insertEmbed(this.cursor.index || 0, 'marker', event.value);
}
}
基于 quill github 中的这些主题,我的代码应该可以正常工作:
topic 3
那么有人可以帮我找到我遗漏了什么或我的问题出在哪里吗?
提前致谢。
我在使用 ngx-quill 时遇到了同样的问题。我认为问题与组件是在 webpack 隐藏的范围内声明的事实有关。因此我们无法访问正确的 Quill 实例来注册额外的组件。
感谢 https://github.com/KillerCodeMonkey/ngx-quill 的 KillerCodeMonkey 的帮助,我得到了一个解决方案。删除任何其他 quill.js 导入(在 package.json 或 .angular-cli.json 中),这应该适用于 angular/core 5.2.0:
import * as Quill from 'quill';
import Parchment from "parchment";
console.log(Quill);
const QuillBlockEmbed = (Quill as any).import('blots/block/embed');
class BlockEmbed extends Parchment.Embed {};
BlockEmbed.prototype = QuillBlockEmbed.prototype;
class MyBlot extends BlockEmbed {
static create(value) {
let node: Element = super.create(value) as Element;
if (typeof value === 'object') {
node.classList.add("my-class");
}
return node;
}
...
}
MyBlot.blotName = 'boltTwo';
MyBlot.tagName = 'img';
(Quill as any).register({ 'blots/myblot':MyBlot});
我很高兴用下一种方法解决我的问题
...
declare var Quill: any;
const BlockEmbed = Quill.import('blots/embed');
export class Variable extends BlockEmbed {
static create(value: any) {
const node = super.create(typeof value === 'object' ? value.text : value);
node.innerText = typeof value === 'object' ? value.text : value;
node.setAttribute('contenteditable', false);
return node;
}
static value(node) {
return {
style: node.getAttribute('contenteditable'),
text: node.innerText
};
}
}
Variable['blotName'] = 'marker';
Variable['className'] = 'marker';
Variable['tagName'] = 'span';
Quill.register('formats/marker', Variable);
export class ManagerComponent implements OnInit, AfterViewInit {
private quill: any;
@ViewChild('stepper') stepper;
@ViewChild(Editor) editorComponent: Editor;
...
variableSelected(event) {
this.quill.insertEmbed(this.cursor.index || 0, 'marker', event.value, 'user');
this.quill.update('user');
}
这种方式对我来说很好用:
import * as QuillNamespace from 'quill';
const Quill: any = QuillNamespace;
const BlockEmbed = Quill.import('blots/block/embed');
我正在与 primeng editor and there is no any problem with editor itself, however I'm fighting two days in a row with extending standard block for custom tag, official documentation says for any additional feature to use quilljs api
合作我检查了每个 api 和 github 上的问题,在我看来,我的方法是正确的,但我无法摆脱这个恼人的错误:
ERROR Error: [Parchment] Unable to create marker blot
at new ParchmentError (scripts.bundle.js:148)
at Object.create (scripts.bundle.js:178)
at BlockBlot.insertAt (scripts.bundle.js:7323)
at Block.insertAt (scripts.bundle.js:855)
at Scroll.ContainerBlot.insertAt (scripts.bundle.js:3404)
at ScrollBlot.insertAt (scripts.bundle.js:7060)
at Scroll.insertAt (scripts.bundle.js:4252)
at Editor.insertEmbed (scripts.bundle.js:2606)
at scripts.bundle.js:1379
at Quill.modify (scripts.bundle.js:1610)
我想要实现的是添加自定义标签,其中包含不可编辑的内容。这是我的代码:
...
import {Editor} from 'primeng/editor';
import * as Quill from 'quill';
import * as Parchment from 'parchment';
const Block = Quill.import('blots/block/embed');
class BlockEmbed extends Parchment.default.Embed {}
BlockEmbed.prototype = Block.prototype;
export class Variable extends BlockEmbed {
static blotName = 'marker';
static tagName = 'marker';
static create(value: any) {
console.log(value);
const node = (super.create(value) as any);
node.innerHTML = '<span contenteditable=false>' + value + '</span>';
node.setAttribute('contenteditable', false);
return node;
}
}
Variable.blotName = 'marker';
Variable.tagName = 'marker';
Quill.register('formats/marker', Variable);
@Component({
selector: 'manager',
templateUrl: './manager.component.html',
styleUrls: ['./manager.component.css']
})
export class ManagerComponent implements OnInit, AfterViewInit {
private quill: any;
@ViewChild(Editor) editorComponent: Editor;
ngOnInit() {}
// based on primeng github issue this how we can get references to quill
ngAfterViewInit() {
this.quill = this.editorComponent.quill;
}
variableSelected(event) {
// grubbing string variable from event
this.quill.insertEmbed(this.cursor.index || 0, 'marker', event.value);
}
}
基于 quill github 中的这些主题,我的代码应该可以正常工作:
topic 3
那么有人可以帮我找到我遗漏了什么或我的问题出在哪里吗? 提前致谢。
我在使用 ngx-quill 时遇到了同样的问题。我认为问题与组件是在 webpack 隐藏的范围内声明的事实有关。因此我们无法访问正确的 Quill 实例来注册额外的组件。 感谢 https://github.com/KillerCodeMonkey/ngx-quill 的 KillerCodeMonkey 的帮助,我得到了一个解决方案。删除任何其他 quill.js 导入(在 package.json 或 .angular-cli.json 中),这应该适用于 angular/core 5.2.0:
import * as Quill from 'quill';
import Parchment from "parchment";
console.log(Quill);
const QuillBlockEmbed = (Quill as any).import('blots/block/embed');
class BlockEmbed extends Parchment.Embed {};
BlockEmbed.prototype = QuillBlockEmbed.prototype;
class MyBlot extends BlockEmbed {
static create(value) {
let node: Element = super.create(value) as Element;
if (typeof value === 'object') {
node.classList.add("my-class");
}
return node;
}
...
}
MyBlot.blotName = 'boltTwo';
MyBlot.tagName = 'img';
(Quill as any).register({ 'blots/myblot':MyBlot});
我很高兴用下一种方法解决我的问题
...
declare var Quill: any;
const BlockEmbed = Quill.import('blots/embed');
export class Variable extends BlockEmbed {
static create(value: any) {
const node = super.create(typeof value === 'object' ? value.text : value);
node.innerText = typeof value === 'object' ? value.text : value;
node.setAttribute('contenteditable', false);
return node;
}
static value(node) {
return {
style: node.getAttribute('contenteditable'),
text: node.innerText
};
}
}
Variable['blotName'] = 'marker';
Variable['className'] = 'marker';
Variable['tagName'] = 'span';
Quill.register('formats/marker', Variable);
export class ManagerComponent implements OnInit, AfterViewInit {
private quill: any;
@ViewChild('stepper') stepper;
@ViewChild(Editor) editorComponent: Editor;
...
variableSelected(event) {
this.quill.insertEmbed(this.cursor.index || 0, 'marker', event.value, 'user');
this.quill.update('user');
}
这种方式对我来说很好用:
import * as QuillNamespace from 'quill';
const Quill: any = QuillNamespace;
const BlockEmbed = Quill.import('blots/block/embed');