将Angular 1.x指令转换为Angular 2

斯图尔特

我有一个带有一些小部件的wrapper-bootstrap模板,我想将它们转换为Angular2。这让我很困惑:

.directive('changeLayout', function(){

    return {
        restrict: 'A',
        scope: {
            changeLayout: '='
        },

        link: function(scope, element, attr) {

            //Default State
            if(scope.changeLayout === '1') {
                element.prop('checked', true);
            }

            //Change State
            element.on('change', function(){
                if(element.is(':checked')) {
                    localStorage.setItem('ma-layout-status', 1);
                    scope.$apply(function(){
                        scope.changeLayout = '1';
                    })
                }
                else {
                    localStorage.setItem('ma-layout-status', 0);
                    scope.$apply(function(){
                        scope.changeLayout = '0';
                    })
                }
            })
        }
    }
})

我有一个新的指令开始(在下面),但是HtmlElement对象isprop属性实际上并不存在。如何获得/设置checked要放置此属性的输入元素的属性?我还认为该指令通过Output属性公开了布局状态,因此父组件可以做出相应的响应。

有人可以指导我吗?我在正确的轨道上吗?谢谢!

新指令:

import { Directive, ElementRef, Output, EventEmitter, OnInit } from '@angular/core';

import { LocalStorage } from "../common";

@Directive({
    selector: '[change-layout]',
    host: {
        '(change)': 'onChange()'
    }
})

export class ChangeLayoutDirective implements OnInit {

    private el: HTMLElement;
    @LocalStorage() public layoutStatus: Number = 0;

    @Output() layoutStatusChange = new EventEmitter();

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

    ngOnInit() {
        this.el.prop('checked', false);
        if(this.layoutStatus === 1) {
            this.el.prop('checked', true);
        }
    }

    onChange() { this.toggleLayout(); }

    private toggleLayout() {
        if(this.el.is(':checked')) {
            this.layoutStatus = 1;
        }
        else {
            this.layoutStatus = 0;
        }
        this.layoutStatusChange.emit({
            value: this.layoutStatus
        });
    }
}
马克·拉杰克(Mark Rajcok)

我建议使用HostBinding和HostListener设置checked对宿主元素属性的双向数据绑定这样,您无需使用ElementRef或nativeElement。

export class ChangeLayoutDirective implements OnInit {
  private layoutStatus = 0;
  @Output() layoutStatusChange = new EventEmitter();
  @HostBinding('checked') checked = false;
  @HostListener('change', ['$event.target.checked'])
  onChange(checked) { 
    console.log('checked =', checked);
    this.toggleLayout(checked); 
  }
  ngOnInit() {
    if(this.layoutStatus === 1) {
      this.checked = true;
    }
  }
  private toggleLayout(checked) {
    this.layoutStatus = checked ? 1 : 0;
    this.checked = checked;
    this.layoutStatusChange.emit({
      value: this.layoutStatus
    });
  }
}

Plunker

HostBinding在指令的checked属性和checkedhost / DOM元素属性之间设置属性绑定

HostListener在指令的onChange()方法和changehost / DOM元素事件之间设置事件绑定

使用Output属性通知更改的父级是一种很好的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将Angular 1.x指令转换为Angular 2

来自分类Dev

将Angular 1转换为Angular 2 ngInit函数

来自分类Dev

将 Angular 1.x 站点转换为 Angular 2.6

来自分类Dev

将 Angular[2] V3, Dart 1 的路由转换为 Angular 5, Dart 2

来自分类Dev

如何将Cordova应用程序从Angular Dart 1转换为Angular 2?

来自分类Dev

Angular 2包含,将指令内容转换为“ alt”

来自分类Dev

将jQuery插件转换为指令Angular

来自分类Dev

将Fancybox插件转换为Angular指令

来自分类Dev

将angularjs指令转换为angular 10

来自分类Dev

将 x => array.Contains(x) 表达式转换为 x=> x == 1 || x==2

来自分类Dev

将 Angular 2 路由转换为 Angular 5

来自分类Dev

Angular2:将数组转换为Observable

来自分类Dev

使用Angular 2管道将时间戳转换为日期

来自分类Dev

如何将js代码转换为angular 2

来自分类Dev

将基于 jquery 的组件转换为 angular 2/4 组件?

来自分类Dev

Angular 2 转换为 Promise

来自分类Dev

如何将方程式“ x ^ 2 + x ^ 2 + 2x-x-25”中变量的空系数转换为“ + 1x ^ 2 + 1x ^ 2 + 2x-1x-25”?

来自分类Dev

如何将2x2x2的NDC的MVP矩阵转换为2x2x1的NDC的MVP矩阵(金属)?

来自分类Dev

将JavaScript \ Ionic \ Angular 1应用迁移到Typescript \ Ionic 2 \ Angular 2应用

来自分类Dev

Angular2 RC1多级routerLink指令

来自分类Dev

将 Angular 2 添加到已有 Angular 1 的旧 JHipster 项目

来自分类Dev

将'1-1-1至1-10-1'转换为'1-1-1','1-2-1',...'1-10-1'的十个值

来自分类Dev

无法将类型1的对象强制转换为类型2?

来自分类Dev

将2个功能转换为1个功能

来自分类Dev

将数组[“ 1”,“ 3”,“ 2”]转换为[132]

来自分类Dev

将2D cvMat转换为1D

来自分类Dev

如何将每2行转换为1行?

来自分类Dev

将2点的距离转换为1/32英寸?

来自分类Dev

将 Struts 1 中的 Action 转换为等效的 Struts 2

Related 相关文章

  1. 1

    将Angular 1.x指令转换为Angular 2

  2. 2

    将Angular 1转换为Angular 2 ngInit函数

  3. 3

    将 Angular 1.x 站点转换为 Angular 2.6

  4. 4

    将 Angular[2] V3, Dart 1 的路由转换为 Angular 5, Dart 2

  5. 5

    如何将Cordova应用程序从Angular Dart 1转换为Angular 2?

  6. 6

    Angular 2包含,将指令内容转换为“ alt”

  7. 7

    将jQuery插件转换为指令Angular

  8. 8

    将Fancybox插件转换为Angular指令

  9. 9

    将angularjs指令转换为angular 10

  10. 10

    将 x => array.Contains(x) 表达式转换为 x=> x == 1 || x==2

  11. 11

    将 Angular 2 路由转换为 Angular 5

  12. 12

    Angular2:将数组转换为Observable

  13. 13

    使用Angular 2管道将时间戳转换为日期

  14. 14

    如何将js代码转换为angular 2

  15. 15

    将基于 jquery 的组件转换为 angular 2/4 组件?

  16. 16

    Angular 2 转换为 Promise

  17. 17

    如何将方程式“ x ^ 2 + x ^ 2 + 2x-x-25”中变量的空系数转换为“ + 1x ^ 2 + 1x ^ 2 + 2x-1x-25”?

  18. 18

    如何将2x2x2的NDC的MVP矩阵转换为2x2x1的NDC的MVP矩阵(金属)?

  19. 19

    将JavaScript \ Ionic \ Angular 1应用迁移到Typescript \ Ionic 2 \ Angular 2应用

  20. 20

    Angular2 RC1多级routerLink指令

  21. 21

    将 Angular 2 添加到已有 Angular 1 的旧 JHipster 项目

  22. 22

    将'1-1-1至1-10-1'转换为'1-1-1','1-2-1',...'1-10-1'的十个值

  23. 23

    无法将类型1的对象强制转换为类型2?

  24. 24

    将2个功能转换为1个功能

  25. 25

    将数组[“ 1”,“ 3”,“ 2”]转换为[132]

  26. 26

    将2D cvMat转换为1D

  27. 27

    如何将每2行转换为1行?

  28. 28

    将2点的距离转换为1/32英寸?

  29. 29

    将 Struts 1 中的 Action 转换为等效的 Struts 2

热门标签

归档