- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试按照作者在此处的示例来实现 ngx-quill 的 Material 版本:ngx-quill-example
问题是我在直接从示例存储库复制的文件 ( mat-quill-base.ts
) 中收到以下错误:
'disabled' is defined as a property in class 'CanUpdateErrorState &CanDisable & MatQuillBase', but is overridden here in '_MatQuillBase'as an accessor.
import {
Directive,
AfterViewInit,
ElementRef,
HostBinding,
Inject,
Input,
NgZone,
OnChanges,
OnDestroy,
Optional,
PLATFORM_ID,
Renderer2,
Self
} from '@angular/core'
import { DOCUMENT } from '@angular/common'
import {
ControlValueAccessor,
FormGroupDirective,
NgControl,
NgForm,
Validator
} from '@angular/forms'
import { DomSanitizer } from '@angular/platform-browser'
import { coerceBooleanProperty } from '@angular/cdk/coercion'
import {
CanDisable,
CanDisableCtor,
CanUpdateErrorState,
CanUpdateErrorStateCtor,
ErrorStateMatcher,
mixinDisabled,
mixinErrorState
} from '@angular/material/core'
import { HasErrorState } from '@angular/material/core/common-behaviors/error-state'
import { MatFormFieldControl } from '@angular/material/form-field'
import { QuillEditorBase, QuillService } from 'ngx-quill'
// Boilerplate for applying mixins to _MatQuillBase
class MatQuillBase extends QuillEditorBase
{
constructor(
public _defaultErrorStateMatcher: ErrorStateMatcher,
public _parentForm: NgForm,
public _parentFormGroup: FormGroupDirective,
public ngControl: NgControl,
elementRef: ElementRef,
domSanitizer: DomSanitizer,
doc: any,
platformId: any,
renderer: Renderer2,
zone: NgZone,
service: QuillService
) {
super(
elementRef, domSanitizer, doc, platformId,
renderer, zone, service
)
}
}
const _MatQuillMixinBase: CanUpdateErrorStateCtor & CanDisableCtor & typeof MatQuillBase =
mixinErrorState(mixinDisabled(MatQuillBase))
@Directive()
export abstract class _MatQuillBase extends _MatQuillMixinBase
implements AfterViewInit, CanDisable, CanUpdateErrorState,
ControlValueAccessor, HasErrorState,
MatFormFieldControl<any>, OnChanges,
OnDestroy, Validator
{
abstract controlType: string
focused = false
abstract id: string
constructor(
defaultErrorStateMatcher: ErrorStateMatcher,
@Optional() parentForm: NgForm,
@Optional() parentFormGroup: FormGroupDirective,
@Optional() @Self() public ngControl: NgControl,
elementRef: ElementRef,
domSanitizer: DomSanitizer,
@Inject(DOCUMENT) doc: any,
@Inject(PLATFORM_ID) platformId: any,
renderer: Renderer2,
zone: NgZone,
service: QuillService
) {
super(
defaultErrorStateMatcher, parentForm, parentFormGroup, ngControl,
elementRef, domSanitizer, doc, platformId, renderer, zone, service
)
if (this.ngControl != null) {
this.ngControl.valueAccessor = this;
}
this.onBlur.subscribe(() => {
this.focused = false
this.stateChanges.next()
})
this.onFocus.subscribe(() => {
this.focused = true
this.stateChanges.next()
})
}
/*
* GETTERS & SETTERS
*/
@Input()
get disabled(): boolean
{
if (this.ngControl && this.ngControl.disabled !== null) {
return this.ngControl.disabled
}
return this._disabled
}
set disabled(value: boolean)
{
this._disabled = coerceBooleanProperty(value)
// Browsers may not fire the blur event if the input is disabled too quickly.
// Reset from here to ensure that the element doesn't become stuck.
if (this.focused) {
this.focused = false
this.stateChanges.next()
}
}
protected _disabled = false
get empty() {
return coerceBooleanProperty(this.value)
}
@Input()
get placeholder(): string { return this._placeholder }
set placeholder(value: string) {
this._placeholder = value
this.stateChanges.next()
}
protected _placeholder: string
@Input()
get required(): boolean { return this._required }
set required(value: boolean) {
this._required = coerceBooleanProperty(value)
}
protected _required = false
@HostBinding('class.floating')
get shouldLabelFloat() {
return this.focused || !this.empty
}
get value(): any
{
try {
return this.valueGetter(this.quillEditor, this.editorElem!)
} catch (e) {
return
}
}
set value(value: any) {
this.writeValue(value)
this.stateChanges.next()
}
/*
* METHODS
*/
blur() {
(this.editorElem.childNodes as NodeListOf<HTMLElement>)[0]['blur']()
}
focus() {
this.quillEditor.focus()
}
@HostBinding('attr.aria-describedby') _describedBy = ''
setDescribedByIds(ids: string[]) {
this._describedBy = ids.join(' ')
}
onContainerClick(event: MouseEvent)
{
if (!this.focused) {
this.quillEditor.focus()
}
}
static ngAcceptInputType_disabled: boolean | string | null | undefined
static ngAcceptInputType_required: boolean | string | null | undefined
}
disabled
,
required
, 和
placeholder
都在
QuillEditorBase
中定义类(class)。这是来自 ngx-quill 节点模块:
export declare abstract class QuillEditorBase implements AfterViewInit, ControlValueAccessor, OnChanges, OnDestroy, Validator {
elementRef: ElementRef;
protected domSanitizer: DomSanitizer;
protected doc: any;
protected platformId: any;
protected renderer: Renderer2;
protected zone: NgZone;
protected service: QuillService;
quillEditor: QuillType;
editorElem: HTMLElement;
content: any;
format?: 'object' | 'html' | 'text' | 'json';
theme?: string;
modules?: QuillModules;
debug?: 'warn' | 'log' | 'error' | false;
readOnly?: boolean;
placeholder?: string;
maxLength?: number;
minLength?: number;
required: boolean;
formats?: string[] | null;
customToolbarPosition: 'top' | 'bottom';
sanitize: boolean;
styles: any;
strict: boolean;
scrollingContainer?: HTMLElement | string | null;
bounds?: HTMLElement | string;
customOptions: CustomOption[];
customModules: CustomModule[];
trackChanges?: 'user' | 'all';
preserveWhitespace: boolean;
classes?: string;
trimOnValidation: boolean;
onEditorCreated: EventEmitter<any>;
onEditorChanged: EventEmitter<EditorChangeContent | EditorChangeSelection>;
onContentChanged: EventEmitter<ContentChange>;
onSelectionChanged: EventEmitter<SelectionChange>;
onFocus: EventEmitter<Focus>;
onBlur: EventEmitter<Blur>;
disabled: boolean;
onModelChange: (modelValue?: any) => void;
onModelTouched: () => void;
onValidatorChanged: () => void;
constructor(elementRef: ElementRef, domSanitizer: DomSanitizer, doc: any, platformId: any, renderer: Renderer2, zone: NgZone, service: QuillService);
static normalizeClassNames(classes: string): string[];
valueGetter: (quillEditor: QuillType, editorElement: HTMLElement) => string | any;
valueSetter: (quillEditor: QuillType, value: any) => any;
ngAfterViewInit(): Promise<void>;
selectionChangeHandler: (range: Range | null, oldRange: Range | null, source: string) => void;
textChangeHandler: (delta: Delta, oldDelta: Delta, source: string) => void;
editorChangeHandler: (event: 'text-change' | 'selection-change', current: any | Range | null, old: any | Range | null, source: string) => void;
ngOnDestroy(): void;
ngOnChanges(changes: SimpleChanges): void;
addClasses(classList: string): void;
removeClasses(classList: string): void;
writeValue(currentValue: any): void;
setDisabledState(isDisabled?: boolean): void;
registerOnChange(fn: (modelValue: any) => void): void;
registerOnTouched(fn: () => void): void;
registerOnValidatorChange(fn: () => void): void;
validate(): {
minLengthError?: {
given: number;
minLength: number;
};
maxLengthError?: {
given: number;
maxLength: number;
};
requiredError?: {
empty: boolean;
};
};
static ɵfac: ɵngcc0.ɵɵFactoryDef<QuillEditorBase, never>;
static ɵdir: ɵngcc0.ɵɵDirectiveDefWithMeta<QuillEditorBase, never, never, { "required": "required"; "customToolbarPosition": "customToolbarPosition"; "sanitize": "sanitize"; "styles": "styles"; "strict": "strict"; "customOptions": "customOptions"; "customModules": "customModules"; "preserveWhitespace": "preserveWhitespace"; "trimOnValidation": "trimOnValidation"; "valueGetter": "valueGetter"; "valueSetter": "valueSetter"; "format": "format"; "theme": "theme"; "modules": "modules"; "debug": "debug"; "readOnly": "readOnly"; "placeholder": "placeholder"; "maxLength": "maxLength"; "minLength": "minLength"; "formats": "formats"; "scrollingContainer": "scrollingContainer"; "bounds": "bounds"; "trackChanges": "trackChanges"; "classes": "classes"; }, { "onEditorCreated": "onEditorCreated"; "onEditorChanged": "onEditorChanged"; "onContentChanged": "onContentChanged"; "onSelectionChanged": "onSelectionChanged"; "onFocus": "onFocus"; "onBlur": "onBlur"; }, never>;
}
我可以进行哪些更改来满足此错误?我在存储库上创建了一个问题,但它在没有任何帮助的情况下被驳回并关闭。所以这是一个死胡同。
最佳答案
来自 https://angular.io/guide/updating-to-version-10 :
New Breaking Changes
Typescript 3.6, 3.7, and 3.8 are no longer supported. Please update toTypescript 3.9.
npm install typescript@3.9.7
我正在使用 Angular 10 和 ngx-quill 以及来自 ngx-quill-example 的相同代码,这对我有用。这至少会节省一些时间。
关于angular - 如何在 Angular/ typescript 中正确覆盖子类中基类的属性? ngx-quill 和 Material ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64175317/
我已经写了并且 npm 发布了这个:https://github.com/justin-calleja/pkg-dependents 现在我正在用 Typescript 编写这个包:https://g
我有一个函数,我想在 TypeScript 中模拟它以进行测试。在我的测试中,我只关心 json和 status .但是,当使用 Jest 的 jest.spyOn 时我的模拟函数的类型设置为返回 h
我正在使用一个库 (Axios),它的包中包含 Typescript 声明。 我想声明一个将 AxiosResponse(在库的 .d.ts 文件中声明)作为参数的函数。我有以下内容: functio
我是 Typescript 的新手。我想使用 将一个 Typescript 文件加载到另一个 Typescript 文件中标签。 我做了一些事情,但它不起作用!请帮助我。 first.ts: imp
为什么我会收到下面屏幕截图中显示的错误? Atom 说我的 tsconfig.json“项目文件包含无效选项”用于 allowJs、buildOnSave 和 compileOnSave。 但是应该允
所以我正在创建一个 TypeScript 库,我可以轻松地将所有生成的 JS 文件编译成一个文件。有没有办法将所有 .ts 和 .d.ts 编译成一个 .ts 文件? 除了支持 JS 的版本(较少的智
Microsoft Research 提供了一种名为Safer TypeScript 的新 TypeScript 编译器变体: http://research.microsoft.com/en-us/
我需要这个来在单个文件中分发 TypeScript 中的库。有没有办法将多个 typescript 文件合并到(一个js文件+一个 typescript 定义)文件中? 最佳答案 要创建一个库,您可以
用例:我想知道一个函数在 typescript 中执行需要多少时间。我想为此目的使用装饰器。我希望装饰器应该返回时间以便(我可以进一步使用它),而不仅仅是打印它。 例如: export functio
我想检查一个类型是否可以为 null,以及它是否具有值的条件类型。 我尝试实现 type IsNullable = T extends null ? true : false; 但是好像不行 type
我的问题是基于这个 question and answer 假设我们有下一个代码: const myFn = (p: { a: (n: number) => T, b: (o: T) => v
我知道双重否定前缀,我知道 TypeScript 的单后缀(非空断言)。 但是这个双后缀感叹号是什么? /.*验证码为(\d{6}).*/.exec(email.body!!)!![1] 取自here
我正在使用以下文件结构在 Webstorm 中开发一个项目 | src | ... | many files | types | SomeInterface |
在 TypeScript 类中,可以为属性声明类型,例如: class className { property: string; }; 如何在对象字面量中声明属性的类型? 我试过下面的代码,但它
我正在寻找一种在不丢失推断类型信息的情况下将 TypeScript 中的文字值限制为特定类型的好方法。 让我们考虑一个类型Named,它保证有一个名字。 type Named = { name:
在 TypeScript 中,我想创建一个联合类型来表示属于一个或多个不同类型的值,类似于 oneOf在 OpenAPI或 JSON Schema .根据a previous answer on a
type Func = (foo:string) => void // function expression const myFunctionExpression:Func = function(f
假设我有一个联合类型,我正在使用类似 reducer 的 API 调用模式,看起来像这样: type Action = { request: { action: "create
我在 typescript 中有以下去抖功能: export function debounce( callback: (...args: any[]) => void, wait: numb
在 Vue3 的 defineComponent 函数中,第一个泛型参数是 Props,所以我在这里使用 Typescript 接口(interface)提供我的 props 类型。喜欢: expor
我是一名优秀的程序员,十分优秀!