javascript - Angular2 在焦点事件上添加类

标签 javascript jquery angular angular-directive

我想将 Angular 1 应用程序更新到 Angular 2,但我的一个旧指令有问题。

这个想法很简单。当输入字段获得焦点时,应添加一个类 (md-input-focus) 并删除另一个类 (md-input-wrapper)。然后这个过程应该在“模糊”事件上被逆转——即失去焦点。

我的旧指令只包含这些行

.directive('mdInput',[
    '$timeout',
    function ($timeout) {
        return {
            restrict: 'A',
            scope: {
                ngModel: '='
            },
            link: function (scope, elem, attrs) {
                var $elem = $(elem);
                $elem.on('focus', function() {
                      $elem.closest('.md-input-wrapper').addClass('md-input-focus')
                })
                .on('blur', function() {
                 $(this).closest('.md-input-wrapper').removeClass('md-input-focus');
                })
             }

等...

我的指令显然有经典的开始,但已经用完了......技能

import {Directive, ElementRef, Renderer, Input} from 'angular2/core';

@Directive({
      selector: '.mdInput',

})

export class MaterialDesignDirective {
      constructor(el: ElementRef, renderer: Renderer) {
           // Insert inciteful code here to do the above
      }
}

如有任何帮助,我们将不胜感激。

更新:

HTML 看起来像(在输入元素获得焦点之前):

<div class="md-input-wrapper">
   <input type="text" class="md-input">
</div>

然后

<div class="md-input-wrapper md-input-focus">
   <input type="text" class="md-input">
</div>

之后。

输入元素是唯一可以接收焦点事件的元素(因此也是指令的目标),但是父元素 <div>需要添加和删除类。

更多帮助

Please see Plunker for help/explanation - 如果有人可以提供帮助,那就太好了

最佳答案

更新

@Directive({selector: '.md-input', host: {
  '(focus)': 'setInputFocus(true)',
  '(blur)': 'setInputFocus(false)',
}})
class MaterialDesignDirective {
  MaterialDesignDirective(private _elementRef: ElementRef, private _renderer: Renderer) {}
  setInputFocus(isSet: boolean): void {
    this.renderer.setElementClass(this.elementRef.nativeElement.parentElement, 'md-input-focus', isSet);
  }
}

原创

无需 ElementRefRenderer(你应该在 Angular2 中努力实现),通过定义主机绑定(bind)就可以轻松完成:

import {Directive, ElementRef, Renderer, Input} from 'angular2/core';

@Directive({
      selector: '.mdInput',
      host: {
        '(focus)':'_onFocus()',
        '(blur)':'_onBlur()',
        '[class.md-input-focus]':'inputFocusClass'
      }

})

export class MaterialDesignDirective {
      inputFocusClass: bool = false;

      _onFocus() {
        this.inputFocusClass = true;
      }

      _onBlur() {
        this.inputFocusClass = false;
      }
}

或者更简洁一点

@Directive({
      selector: '.mdInput',
      host: {
        '(focus)':'_setInputFocus(true)',
        '(blur)':'_setInputFocus(false)',
        '[class.md-input-focus]':'inputFocusClass'
      }

})

export class MaterialDesignDirective {
      inputFocusClass: bool = false;

      _setInputFocus(isFocus:bool) {
        this.inputFocusClass = isFocus;
      }
}

我只在 Dart 中尝试过,效果很好。我希望我能正确地将它翻译成 TS。

不要忘记将类添加到使用指令的元素的 directives: 中。

关于javascript - Angular2 在焦点事件上添加类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34799667/

相关文章:

javascript - js正则表达式提取字母之间的空格。积极回顾?

jquery - SharePoint 2010 功能区隐藏/{在库项目选择或其他事件上显示}

php - 使用ajax将post数据提交到php文件

javascript - 如何保护数组不被刷新

javascript - 没有导出成员 'Headers' 和 RequestOptions

javascript - 替代 HTML iframe

javascript - 使用 Jquery 将 HTML 表单发布数据发送到文件?

javascript - 用代码覆盖右箭头 firefox?

javascript - 在提交表单上显示模态

javascript - 检查 JavaScript 中的时间是否早于其他时间