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


Posted in Javascript onNovember 02, 2018

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() {
 }

}

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

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

我们先创建一个数组,用于存放上文创建的两个组件ButtonComponent和TextComponent,位置交换时,只需要调换组件在数组中的位置即可,代码如下:

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在浏览器中可以看到如下效果:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Prototype使用指南之ajax
Jan 10 Javascript
js Form.elements[i]的使用实例
Nov 13 Javascript
Jquery获取复选框被选中值的简单方法
Jul 04 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
Jun 15 Javascript
jQuery实现防止提交按钮被双击的方法
Mar 24 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
Jun 16 Javascript
全面解析Bootstrap表单使用方法(表单控件)
Nov 24 Javascript
Jquery $when done then的用法详解
May 20 Javascript
bootstrap css样式之表单
Jan 19 Javascript
JavaScript同源策略和跨域访问实例详解
Apr 03 Javascript
JS插件clipboard.js实现一键复制粘贴功能
Dec 04 Javascript
关于node-bindings无法在Electron中使用的解决办法
Dec 18 Javascript
vue单页面实现当前页面刷新或跳转时提示保存
Nov 02 #Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
Nov 02 #Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
Nov 02 #Javascript
axios使用拦截器统一处理所有的http请求的方法
Nov 02 #Javascript
vue实现与安卓、IOS交互的方法
Nov 02 #Javascript
解决iview多表头动态更改列元素发生的错误的方法
Nov 02 #Javascript
JavaScript 点击触发复制功能实例详解
Nov 02 #Javascript
You might like
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
php中请求url的五种方法总结
2017/07/13 PHP
PHP学习笔记之session
2018/05/06 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
动态样式类封装JS代码
2009/09/02 Javascript
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
JavaScript中的继承方式详解
2015/02/11 Javascript
使用jQuery处理AJAX请求的基础学习教程
2016/05/10 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
2016/12/17 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
2017/04/11 Javascript
Vue.Draggable实现拖拽效果
2020/07/29 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
一个因@click.stop引发的bug的解决
2019/01/08 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
详解Vue之计算属性
2020/06/20 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
[02:33]2014DOTA2 TI每日综述 LGD涉险晋级DK闯入胜者组
2014/07/14 DOTA
Python输入二维数组方法
2018/04/13 Python
浅谈python之新式类
2018/08/12 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
Python 实现取多维数组第n维的前几位
2019/11/26 Python
浅析Python 多行匹配模式
2020/07/24 Python
阿玛尼化妆品美国官网:Giorgio Armani Beauty
2017/02/02 全球购物
优秀信贷员先进事迹
2014/01/31 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
2015年求职自荐信范文
2015/03/04 职场文书
运动会通讯稿600字
2015/07/20 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书