首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >debounceTime到CodeMirror角

debounceTime到CodeMirror角
EN

Stack Overflow用户
提问于 2018-01-31 06:14:38
回答 2查看 695关注 0票数 3

我已经尝试了多个变体,也是在这个可能的Dup之后

使用ng2-codemirror 1.1.3库+ codemirror 5.33.0锚点

我所要做的就是将一个DebounceTime操作符附加到CodeMirror编辑器的change事件中

html:

代码语言:javascript
复制
<codemirror #cm [(ngModel)]="code" [config]="config" (focus)="onFocus()" (blur)="onBlur()"></codemirror>

ts:

代码语言:javascript
复制
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/fromEvent';
import 'rxjs/add/operator/debounceTime';

@ViewChild('cm') editor;

ngAfterViewInit() {
  const watch = Observable.fromEvent(this.editor, 'change'); // <--- Error
  watch.subscribe(v => console.log(v));
}

我得到的错误是:

错误TypeError:无效事件目标

我还尝试将Observable.fromEvent附加到this.editor.value/ this.editor.input

编辑整个组件: component.HTML:

代码语言:javascript
复制
<codemirror #cm [(ngModel)]="code" [config]="config" (focus)="onFocus()" (blur)="onBlur()"></codemirror>

component.TS:

代码语言:javascript
复制
import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { global } from '../shared/global.constants';
import 'codemirror/mode/javascript/javascript';
import 'codemirror/addon/scroll/simplescrollbars';
import 'codemirror/addon/hint/javascript-hint';
import 'codemirror/addon/hint/show-hint.js';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/fromEvent';
import 'rxjs/add/operator/debounceTime';

@Component({
  selector: 'app-main',
  templateUrl: './main.component.html',
  styleUrls: ['./main.component.scss']
})
export class MainComponent implements OnInit, AfterViewInit {
  @ViewChild('cm') editor;
  @ViewChild('output') output;
  code = global.code;
  config = {
    lineNumbers: true,
    mode: {name: 'javascript', json: true},
    tabSize: 2,
    scrollbarStyle: 'simple',
    extraKeys: {'Tab': 'autocomplete', 'Ctrl-Space': 'autocomplete'}
  };

  constructor() {

  }

  ngOnInit() {

  }

  ngAfterViewInit() {
    console.log(this.editor); // <--- CodemirrorComponent {change: EventEmitter, focus: EventEmitter, blur: EventEmitter, cursorActivity: EventEmitter, instance: CodeMirror$1, …}
    console.log(this.editor.nativeElement); // <--- undefined
    const watch = Observable.fromEvent(this.editor.host.nativeElement, 'input');
    console.log(watch);
    watch.subscribe(w => console.log(w)); // <-- invalid target
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-31 08:02:53

考虑到<codemirror>是一个组件,@ViewChild('cm') editor查询组件类的实例,而@ViewChild('cm') editor: ElementRef只是欺骗类型系统,但不影响editor值。

正如参考文献解释的那样,read属性用于指定应该查询哪个令牌。为了强制它成为ElementRef,它应该是:

代码语言:javascript
复制
@ViewChild('cm', { read: ElementRef }) editor: ElementRef;

然后可以将事件侦听器添加到DOM元素中(另一个答案已经解释了):

代码语言:javascript
复制
const watch = Observable.fromEvent(this.editor.nativeElement, 'change');
票数 3
EN

Stack Overflow用户

发布于 2018-01-31 06:17:52

Passon元素(nativeElement)到Observable.fromEvent方法。

代码语言:javascript
复制
ngAfterViewInit() {
  const watch = Observable.fromEvent(this.editor.nativeElement, 'change');
  watch.subscribe(v => console.log(v));
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48535611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档