在Angular 2 Component

时间:2016-10-13 14:26:14

标签: javascript angular typescript

我在Angular 2中编写了一个可重用的组件,以在我的应用程序中显示Summernote WYSIWYG编辑器。该组件接受3个输入参数,这些参数被设置为呈现的textarea的属性,作为id,name和最后一个用作主体。我的问题是在这个组件中我正在初始化Summernote插件并创建编辑器。 在这里,我不想硬编码选择器名称,并希望组件接收的动态值作为组件的输入参数。相关代码如下。

import {Component, ElementRef, OnInit, EventEmitter, Input, Output, Inject, ComponentRef} from '@angular/core';
import {Http} from '@angular/http';

declare var $: any;

@Component({
    selector: 'editor',
    template: `<textarea id="{{eid}}" name="{{ename}}" class="form-control">{{body}}</textarea>`
})

export class EditorComponent {

    @Input() body: string;
    @Input() eid: string;
    @Input() ename: string;
    @Output() onContentChanged: EventEmitter<any>;

    constructor(){}

    ngAfterViewInit()
    {
        $(document).on("pageLoaded", function (){
            console.log("pageLoaded");

                $("#body").summernote({
                    height: '200px',
                    callbacks: {
                        onChange: function(contents, $editable) {
                            $("#body").val(contents);
                        }
                    }
                });

        });
    }
}

在这里,您可以看到我在$("#body")块内使用了ngAfterViewInit两次。我希望将其替换为eid变量。我已经尝试了{{eid}}但它不起作用并在浏览器控制台中抛出以下错误。

EXCEPTION: Syntax error, unrecognized expression: #{{eid}}

this.eid无法在此处使用,因为我们在javascript方法中而不是打字稿。

我在我的其他视图文件中使用此组件作为指令。

<editor [body]="page.body" eid="body" ename="body"></editor>

使用动态值正确设置组件中的template块。只有javascript部分才是我的问题。

我有没有其他方式在这里失踪?

P.S。到目前为止它的效果很好。我只是想让初始化完全动态化,这样我就可以在任何地方使用不同的ID。

1 个答案:

答案 0 :(得分:4)

您可以尝试使用箭头功能代替功能来保持相同的上下文。

  $(document).on("pageLoaded", () => {
            console.log("pageLoaded");

                $(this.eid).summernote({
                    height: '200px',
                    callbacks: {
                        onChange: (contents, $editable) => {
                            $(this.eid).val(contents);
                        }
                    }
                });

        });
    }