访问Angular2 JavaScript ES5组件中的元素

时间:2016-01-06 13:38:50

标签: javascript angular components ecmascript-5

编辑:由于大多数评论到目前为止都给了我TypeScript解决方案,我觉得我需要在这里重复一遍:使用JavaScript ES5。

我想创建一个canvas组件,我根据绑定属性绘制数据。如何使用JavaScript在Angular2中执行此操作?

我使用Angular 1的方法是在指令中获取元素引用,但是我无法知道现在该怎么做。

这是一种似乎有效的方法,但我觉得这样做后洗手:

(function (app) {
    app.DrawingComponent = ng.core
        .Component({
            selector: 'my-drawing',
            template: '<div><canvas id="{{randomId}}"></canvas></div>'
        })
        .Class({
            constructor: function () {
                this.randomId = "canvas" + Math.random();
            },
            ngAfterViewInit: function() {
                var canvas = document.getElementById(this.randomId);
                console.log(canvas);
            }
        });
})(window.app || (window.app = {}));

3 个答案:

答案 0 :(得分:9)

我引用的TS solution和ES5之间的唯一区别是您拨打ViewChild的方式

使用TS时,您可以直接使用注释@ViewChild,在ES5中,您必须使用组件中的queries参数

app.DrawingComponent = ng.core
    .Component({
        selector: 'my-drawing',
        template: '<div><canvas #myCanvas></canvas></div>',

        // Check here! This is important!
        queries : {
          myCanvas : new ng.core.ViewChild('myCanvas')
        }
    })
    .Class({
        constructor: function () {},
        ngAfterViewInit: function() {
            console.log(this.myCanvas);
        }
    });

这是展示其用途的plnkr。还有另一个answer可以帮助您更多地理解它的用法。

答案 1 :(得分:6)

将模板变量('#canvas')添加到元素

template: '<div><canvas #canvas id="{{randomId}}"></canvas></div>'

使用@ViewChild注释

@ViewChild('canvas') canvas;

实施AfterViewInit并在调用ngAfterViewInit()后,使用canvas初始化ElementRef字段。使用canvas.nativeElement,您可以访问<canvas>元素。

答案 2 :(得分:0)

我不确定非打字稿语法是什么,但我确定你知道自己。

我就是这样做的:

export class Navigation {

    constructor(elementRef: ElementRef) {
        // elementRef.nativeElement is the actual element
    }
}