CodeMirror Line-Break 不添加行号 - Angular
CodeMirror Line-Break doesn't add line number - Angular
我正在使用来自 ngx-codemirror 的代码镜像。我想在它适合父级的宽度时拆分线。我找到了一些使用
拆分类似内容的解决方案
lineWrapping: true
和风格
.CodeMirror-wrap pre {
word-break: break-word;
}
使用这个我可以拆分行,但我也需要显示行号。
刚刚拆分的行不显示行号。
这是针对我的问题的 stackblitz link:code-mirror-line-break-issue
截图:
请帮我解决这个问题。
使用 Code Mirror 选项这是不可行的,因为这有点违反直觉,很少(曾经?)想要。
就像我在评论中所说的那样,假设有 2 个人在 phone/web 上讨论 code/json 的一部分。如果他们有不同的 windows/screen 大小
,当一个人向另一个人提到行号时,他们将不会看到相同的东西
解决方案
作为技巧,您可以创建自己的代表行号的元素并将它们放在默认行号上。
注意:这是一个非常基本的示例。如果您更改代码镜像设置(字体大小、间距等),您可能需要调整 css 或根据这些设置进行更多计算。
component.html
<div class='codeMirrorContainer'>
<ngx-codemirror
#codeMirror
[options]="codeMirrorOptions"
[(ngModel)]="codeObj"
></ngx-codemirror>
<ul class='lineContainer' [style.top.px]="-topPosition">
<li [style.width.px]='lineWidth' *ngFor="let line of lines">{{line}}</li>
</ul>
</div>
component.css
li
{
height: 19px;
list-style: none;
}
.codeMirrorContainer
{
position:relative;
overflow: hidden;
}
.lineContainer
{
position:absolute;
top:0;
left:0;
margin: 0;
padding: 5px 0 0 0;
text-align: center;
}
::ng-deep .CodeMirror-linenumber
{
visibility: hidden; /* Hides default line numbers */
}
component.ts
export class AppComponent
{
@ViewChild('codeMirror') codeMirrorCmpt: CodemirrorComponent;
private lineHeight: number;
public lineWidth;
public topPosition: number;
public lines = [];
codeMirrorOptions: any = ....;
codeObj :any = ...;
constructor(private cdr: ChangeDetectorRef)
{
}
ngAfterViewInit()
{
this.codeMirrorCmpt.codeMirror.on('refresh', () => this.refreshLines());
this.codeMirrorCmpt.codeMirror.on('scroll', () => this.refreshLines());
setTimeout(() => this.refreshLines(), 500)
}
refreshLines()
{
let editor = this.codeMirrorCmpt.codeMirror;
let height = editor.doc.height;
this.lineHeight = editor.display.cachedTextHeight ? editor.display.cachedTextHeight : this.lineHeight;
if (!this.lineHeight)
{
return;
}
let nbLines = Math.round(height / this.lineHeight);
this.lines = Array(nbLines).fill(0).map((v, idx) => idx + 1);
this.lineWidth = editor.display.lineNumWidth;
this.topPosition = document.querySelector('.CodeMirror-scroll').scrollTop;
this.cdr.detectChanges();
}
}
我正在使用来自 ngx-codemirror 的代码镜像。我想在它适合父级的宽度时拆分线。我找到了一些使用
拆分类似内容的解决方案lineWrapping: true
和风格
.CodeMirror-wrap pre {
word-break: break-word;
}
使用这个我可以拆分行,但我也需要显示行号。 刚刚拆分的行不显示行号。 这是针对我的问题的 stackblitz link:code-mirror-line-break-issue
截图:
请帮我解决这个问题。
使用 Code Mirror 选项这是不可行的,因为这有点违反直觉,很少(曾经?)想要。
就像我在评论中所说的那样,假设有 2 个人在 phone/web 上讨论 code/json 的一部分。如果他们有不同的 windows/screen 大小
,当一个人向另一个人提到行号时,他们将不会看到相同的东西解决方案
作为技巧,您可以创建自己的代表行号的元素并将它们放在默认行号上。
注意:这是一个非常基本的示例。如果您更改代码镜像设置(字体大小、间距等),您可能需要调整 css 或根据这些设置进行更多计算。
component.html
<div class='codeMirrorContainer'>
<ngx-codemirror
#codeMirror
[options]="codeMirrorOptions"
[(ngModel)]="codeObj"
></ngx-codemirror>
<ul class='lineContainer' [style.top.px]="-topPosition">
<li [style.width.px]='lineWidth' *ngFor="let line of lines">{{line}}</li>
</ul>
</div>
component.css
li
{
height: 19px;
list-style: none;
}
.codeMirrorContainer
{
position:relative;
overflow: hidden;
}
.lineContainer
{
position:absolute;
top:0;
left:0;
margin: 0;
padding: 5px 0 0 0;
text-align: center;
}
::ng-deep .CodeMirror-linenumber
{
visibility: hidden; /* Hides default line numbers */
}
component.ts
export class AppComponent
{
@ViewChild('codeMirror') codeMirrorCmpt: CodemirrorComponent;
private lineHeight: number;
public lineWidth;
public topPosition: number;
public lines = [];
codeMirrorOptions: any = ....;
codeObj :any = ...;
constructor(private cdr: ChangeDetectorRef)
{
}
ngAfterViewInit()
{
this.codeMirrorCmpt.codeMirror.on('refresh', () => this.refreshLines());
this.codeMirrorCmpt.codeMirror.on('scroll', () => this.refreshLines());
setTimeout(() => this.refreshLines(), 500)
}
refreshLines()
{
let editor = this.codeMirrorCmpt.codeMirror;
let height = editor.doc.height;
this.lineHeight = editor.display.cachedTextHeight ? editor.display.cachedTextHeight : this.lineHeight;
if (!this.lineHeight)
{
return;
}
let nbLines = Math.round(height / this.lineHeight);
this.lines = Array(nbLines).fill(0).map((v, idx) => idx + 1);
this.lineWidth = editor.display.lineNumWidth;
this.topPosition = document.querySelector('.CodeMirror-scroll').scrollTop;
this.cdr.detectChanges();
}
}