angular6 利用 ngContentOutlet 实现组件位置交换(重排)

news/2024/7/5 9:47:17

ngContentOutlet指令介绍

ngContentOutlet指令与 ngTemplateOutlet指令类似,都用于 动态组件,不同的是, 前者传入的是一个 Component,后者传入的是一个 TemplateRef

首先看一下使用:

<ng-container *ngComponentOutlet="MyComponent"></ng-container>

其中MyComponent是我们自定义的组件,该指令会自动创建组件工厂,并在ng-container中创建视图。

实现组件位置交换

angular中视图是和数据绑定的,它并不推荐我们直接操作HTML DOM元素,而且推荐我们通过操作数据的方式来改变组件视图。


首先定义两个组件:

button.component.ts

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-button',
  template: `<button>按钮</button>`,
  styleUrls: ['./button.component.css']
})
export class ButtonComponent implements OnInit {

  constructor() { }

  ngOnInit() {
  }

}

text.component.ts

import { Component, OnInit, Input } from '@angular/core';

@Component({
  selector: 'app-text',
  template: `
  <label for="">{{textName}}</label>
  <input type="text">
  `,
  styleUrls: ['./text.component.css']
})
export class TextComponent implements OnInit {
  @Input() public textName = 'null';
  constructor() { }

  ngOnInit() {
  }

}

我们在下面的代码中,动态创建以上两个组件,并实现位置交换功能。

动态创建组件,并实现位置交换

我们先创建一个数组,用于存放上文创建的两个组件 ButtonComponentTextComponent,位置交换时,只需要调换组件在数组中的位置即可,代码如下:
import { TextComponent } from './text/text.component';
import { ButtonComponent } from './button/button.component';
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
  <ng-container *ngFor="let item of componentArr" >
    <ng-container *ngComponentOutlet="item"></ng-container>
  </ng-container>
  <br>
  <button (click)="swap()">swap</button>
`,
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  public componentArr = [TextComponent, ButtonComponent];
  constructor() {
  }
  public swap() {
    const temp = this.componentArr[0];
    this.componentArr[0] = this.componentArr[1];
    this.componentArr[1] = temp;
  }
}

执行命令npm start在浏览器中可以看到如下效果:

图片描述


http://www.niftyadmin.cn/n/2103134.html

相关文章

JTable的模型

2018-11-04 23:15:21开始写 模型类 1 import javax.swing.table.DefaultTableModel;//导入包2 3 public class LocalTableModel extends DefaultTableModel {//继承4 Class[] types new Class[] {java.lang.String.class, java.lang.String.class};// 表头的类类型5 b…

体验荣耀手环4Running版,玩出健康!

手环现在已经成为了很多人生活的必备&#xff0c;刚开始接触的时候觉得挺新奇可以看时间查看一些运动数据&#xff0c;但时间长了就感觉不够给力了&#xff0c;主要是对于喜欢运动的我来说&#xff0c;这些手环产品并没有起到太大的作用&#xff0c;之后基本只是当做简单的小手…

智能媒体管理(IMM)文档转换/预览提供 API 按量计费模式

一、导语 智能媒体管理 (Intelligent Media Management, IMM) 是阿里云的云服务&#xff0c;它通过 文档标准型 实例提供了 Cloud Native 架构的文档转换/预览功能 &#xff0c;本文介绍 API 按量计费模式的配置。 二、创建文档标准型按量计费项目 使用 API 按量计费&#xff…

XCode各版本与Mac OS各版本对应列表

Apple公司你不说牛B是不行的&#xff01;人家就是凭借“封闭”式开发与“封闭”式销售&#xff0c;硬是把手机移动市场的一大块牢牢把握住。我还不知道&#xff0c;目前世界上还有哪些IT公司敢向他们挑战。不费话了&#xff0c;现在把XCode各版本与Mac OS各版本对应列表如下&am…

拉格朗日插值和牛顿插值 matlab

1. 已知函数在下列各点的值为 0.2 0.4 0.6 0.8 1.0 0.98 0.92 0.81 0.64 0.38 用插值法对数据进行拟合&#xff0c;要求给出Lagrange插值多项式和Newton插值多项式的表达式&#xff0c;并计算插值多项式在点的值。 程序&#xff1a; x[0.2 0.4 0.6 0.8 1.0]; y[0.98 …

零基础学习hadoop开发先明白这层关系

零基础学习hadoop开发先明白这层关系大数据hadoop无疑是当前互联网领域受关注热度最高的词之一&#xff0c;大数据技术的应用正在潜移默化中对我们的生活和工作产生巨大的改变。这种改变给我们的感觉是“水到渠成”&#xff0c;更为让人惊叹的是大数据已经仅仅是互联网行业的风…

Python-计算机硬件基础

预习计算机硬件基础1&#xff0c;CPU/内存、硬盘2&#xff0c;存储器什么是编程语言什么是编程编程的目的运行程序的三大核心硬件重要&#xff1a;运行程序&#xff0c;硬件的工作过程 -------------------------------------------------------------- 1&#xff0c;语言&…

设计模式-UML关系基础

设计模式-UML关系基础UML关系基础 类之间的关系 泛化 类在继承中表现为泛化和实现。继承关系为is-a的关系&#xff0c;两个对象之间用is-a表示为继承关系。eg&#xff0c;自行车是车&#xff0c;猫是动物。泛化关系用空心箭头表示如下图。A继承自B 用空心箭头表示A继承自B泛化关…