这个。$ el undefined在编写typescript插件时

时间:2016-06-30 10:20:41

标签: javascript typescript angular

我是JavaScript的新手。在这里,我想创建一个启用自定义属性和相关行为的模块。

首先,在customised.ts开始时,我导入了Directive和ElementRef,而我在main.ts上导入了Jquery。因此我只包括[customised.ts]

import {Directive, ElementRef} from '@angular/core';
declare var jQuery: any;

@Directive ({
  selector: '[customised]'
})

以下代码是导出类,问题是当我在事件监听器函数中调用它。$ el时,这个。$ el将是未定义的。

export class ClearInput {
  $el: any;

  constructor(el: ElementRef) {
    this.$el = jQuery(el.nativeElement);
  }


  render():void {
    let toggleClass = (variable) => {
      return variable ? 'addClass' : 'removeClass';
    };

    this.$el.addClass('customised')
    .bind('input', function() {
      this.$el[toggleClass(this.$el.val())]('x');
    })
    .on('mousemove', function(e) {
      if(this.$el.hasClass('x')) { // error
        this.$el[toggleClass(this.$el.val())]('onX');
      }
    })
  }

  ngOnInit(): void {
    this.render();
  }
}

问题是:

  1. 为什么这样。$ el.addClass将被执行两次?
  2. 为什么这样。$ el;" if"控制流是未定义的,然后抛出一个错误:TypeError:无法读取属性' hasClass'未定义的。

2 个答案:

答案 0 :(得分:1)

更改

  constructor(el: ElementRef) {
    this.$el = jQuery(el.nativeElement);
  }

  ngAfterViewInit(el: ElementRef) {
    this.$el = jQuery(el.nativeElement);
  }

答案 1 :(得分:0)

此。$ el 未定义,因为在调用 mousemove 侦听器时,很可能被jquery更改。

如果要在侦听器中保留相同的上下文,可以使用箭头函数。

.on('mousemove', e => {
  if (this.$el.hasClass('x')) {
    this.$el[toggleClass(this.$el.val())]('onX');
  }
})

为什么 addClass 执行两次,可能渲染函数执行两次?