【问题标题】:How to Access codemirror text area value in Angular2 Component?如何访问 Angular2 组件中的代码镜像文本区域值?
【发布时间】:2016-07-07 21:59:24
【问题描述】:

我正在尝试将 codemirror 与 Angular 2 (TypeScript) 链接。 现在,我可以使用 codearea 自定义指令显示 CodeEditor,它会动态加载脚本文件并格式化文本区域。

我无法获取值,用户在文本区域输入,我尝试过 NgModel、value 等,我认为 codemirror 正在删除文本区域并重新插入,这可能会导致错误。

我尝试使用 onchange 和 keyup 事件处理程序,但是当在文本区域中输入任何内容时,它们会被重复调用。所以这没有用。

这是代码区域组件的代码:

import {Component, AfterViewChecked,AfterViewInit} from 'angular2/core';

@Component({
    selector: 'code-area',
    template: `
    <input [(ngModel)]="ic_code">
    <textarea [(ngModel)]="ic_code" id='problem2' name='problem2' rows='10' cols='80'>

    </textarea>
    <div>
    <textarea [(ngModel)]="ic_code" id='problem1' name='problem2' rows='10' cols='80'>
    int main(){

    }
    </textarea>
    </div>
    <button (click)="submit_clicked()">Submit</button>
    <input [(ngModel)]="ic_code">
    `
})
export class CodeArea implements AfterViewInit,AfterViewChecked{
    public ic_code;
    public ic_code2;
    public ic_codediv;
    constructor(){
        this.ic_code = "";
        System.import('app/applycodemirror')
            .then(refToLoadedScript => {
                applycodestyle();
            });
    }

    ngAfterViewInit(){
        console.log("AFter view init called in CodeArea");
    }
    ngAfterViewChecked(){

    }
    onChange(){
        //This is being repeatedly called
    }
    submit_clicked() {
        //I need the code here ,when user clicks on submit
    }
    onKey(event: any) {
        console.log(event.target.value+' ');
    }

}

这里是外部js文件

function applycodestyle(){
      if(document.getElementById("problem1") != null){
        console.log("Problem 1 present");
        var cEditor = CodeMirror.fromTextArea(document.getElementById("problem1"), {
          lineNumbers: true,
          matchBrackets: true,
          mode: "text/x-csrc",
        });
      }else{
        console.log("Problem 1 null");
      }
}

【问题讨论】:

    标签: javascript angularjs typescript angular codemirror


    【解决方案1】:

    我使用它有点不同,但也许它会帮助你。 Basiaclly 在 ngAfterViewInit 我使用 elementRef 创建代码镜像实例:

    this.cm = CodeMirror(this.elementRef.nativeElement, options);
    

    然后在 onChange 事件中:

    this.cm.on('change', (editor: CodeMirror.Editor) => {
      editor.getDoc().getValue();
    });
    

    如果您不想使用 onChange,您可以随时从代码镜像实例中获取值,例如。

    cmInstance.getEditor().getDoc().getValue()
    

    【讨论】:

    • 嘿kit,你能在plunker上发布一个小代码示例,解释你是如何设置elementref的,你能解释一下你使用的第二个代码sn-p吗?
    • plunker 会非常耗时,抱歉。 elementRef 是 Angular 的一项服务,使您能够通过其 nativeElement 属性获取组件的 DOM。 nativeElement 只是一个具有所有优点的 DOM 元素。使用例如。 querySelector 方法来获取要在其上触发 CodeMirror 的 DOM 元素。关于秒码狙击手。代码镜像实例有一个事件监听器。你用 on() 激活它。在那里你可以访问编辑器,你可以从中获取文档和值。
    • 你在导入 CodeMirror 吗,我的意思是 Dosent Typescript 会抛出任何错误,因为 CodeMirror 不可用。
    • 你有 codemirror 的类型。我不知道您使用的是 typings 还是 tsd 所以分别是 typings install codemirror --save-dev --ambient 或 tsd install codemirror --save-dev
    【解决方案2】:

    您可以使用ng2-codemirror

    安装

    npm install ng2-codemirror --save

    设置

    systemjs.config.js

    /**
     * System configuration for Angular samples
     * Adjust as necessary for your application needs.
     */
    (function (global) {
        var data = {
            paths: {
                // paths serve as alias
                'npm:': '/node_modules/'
            },
            // map tells the System loader where to look for things
            map: {
                // our app is within the app folder
                app: '/Template/js/kpxl/app',
    
                // angular bundles
                '@angular/core': 'npm:@angular/core/bundles/core.umd.js',
                '@angular/common': 'npm:@angular/common/bundles/common.umd.js',
                '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
                '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
                '@angular/platform-browser-dynamic':
                    'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
                '@angular/http': 'npm:@angular/http/bundles/http.umd.js',
                '@angular/router': 'npm:@angular/router/bundles/router.umd.js',
                '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
    
                //Add these code mirror packages
                'ng2-codemirror': 'npm:ng2-codemirror',
                'codemirror': 'npm:codemirror',
            },
            // packages tells the System loader how to load when no filename and/or no extension
            packages: {
                codemirror: {
                    main: 'lib/codemirror.js',
                    defaultExtension: 'js'
                }
            }
        };
        data.packages['ng2-codemirror'] = { main: 'lib/index.js', defaultExtension: 'js' };
        System.config(data);
    })(this);
    

    使用示例

    在您的页面中包含 CodeMirror css 文件

    <link href="/node_modules/codemirror/lib/codemirror.css" rel="stylesheet" />
    <link href="/node_modules/codemirror/theme/ambiance.css" rel="stylesheet" />
    

    在你的主模块中包含CodemirrorModule

    import { CodemirrorModule } from 'ng2-codemirror';
    
    @NgModule({
      // ... 
      imports:      [
        CodemirrorModule
      ],
      // ... 
    })
    export class AppModule { }
    

    在您的任何Component 中使用。

    import { Component } from 'angular2/core';
    
    @Component({
      selector: 'sample',
      template: `
        <codemirror [(ngModel)]="code"
          [config]="{...}"
          (focus)="onFocus()"
          (blur)="onBlur()">
        </codemirror>
      `
    })
    export class Sample{
      constructor(){
        this.code = `// Some code...`;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 2012-05-01
      相关资源
      最近更新 更多