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

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

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

(0)

相关推荐

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

    ngContentOutlet指令介绍 ngContentOutlet指令与ngTemplateOutlet指令类似,都用于动态组件,不同的是,前者传入的是一个Component,后者传入的是一个TemplateRef. 首先看一下使用: <ng-container *ngComponentOutlet="MyComponent"></ng-container> 其中MyComponent是我们自定义的组件,该指令会自动创建组件工厂,并在ng-container

  • Flutter利用SizeTransition实现组件飞入效果

    目录 前言 SizeTransition 介绍 应用 使用 SizeTransition 实现其他动画效果 总结 前言 继续 Transition 系列动画组件的介绍,本篇来介绍 SizeTransition.SizeTransition 用于更改子组件的尺寸来实现动画.支持垂直方向或水平方向修改动画,同时尺寸更改的起始位置可以从顶部.中部.底部(垂直方向)或左侧.中间.右侧(水平方向)开始.通过这些特性,我们可以构建组件飞入的效果. SizeTransition 介绍 SizeTransiti

  • Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案

    在项目中开始使用vue2来构建项目了,跟 vue1 很大的一处不同在于2 取消了props 的双向绑定,改成只能从父级传到子级的单向数据流,初衷当然是好的,为了避免双向绑定在项目中容易造成的数据混乱. 解决方案一 然后开始参考网上和github上的方案等等,发现很多解决方案是这样的 用data对象中创建一个props属性的副本 watch props属性 赋予data副本 来同步组件外对props的修改 watch data副本,emit一个函数 通知到组件外 这里以最常见的 modal为例子:

  • JS利用cookie记忆当前位置的防刷新导航效果

    本文实例讲述了JS利用cookie记忆当前位置的防刷新导航效果.分享给大家供大家参考.具体如下: 这里演示利用cookie记忆当前位置的防刷新导航条,主要向大家展示如何在Js中使用Cookies技术,用好了Cookies,会使你的Js技术更上一层楼.这个菜单就感觉不错,当你鼠标点击之后,重新刷新页面后它仍然是保留在原位置,好像带有记忆功能. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-cookie-nav-pos-menu-demo/

  • IOS 中UIKit-UIPageControl利用delegate定位圆点位置

    IOS 中UIKit-UIPageControl利用delegate定位圆点位置 在UIScrollView中会添加UIPageControl作为页码标识,可以让用户清楚的知道当前的页数.我们需要优化的一点是让pageControl的小圆点精确的跟着scrollView而定位.我们先来看一下效果图: 我们发现,当图片拖动不到一半的时候,pageControl的圆点定位到前一张图,图片拖动超过一半的时候,定位到下一张图.这里就需要四舍五入的计算了. 我们可以利用协议 delegate 去做这件事情

  • android实现携程购票起始点位置交换

    本文实例为大家分享了android实现购票起始点位置交换的具体代码,供大家参考,具体内容如下 效果图: 点击交换位置按钮,北京和深圳布局交换位置. xml布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width=

  • Java利用 Exchanger 实现游戏中交换装备

    目录 1 Exchanger 是什么 2 Exchanger 详解 3 Exchanger 应用 1 Exchanger 是什么 JDK 1.5 开始 JUC 包下提供的 Exchanger 类可用于两个线程之间交换信息.Exchanger 对象可理解为一个包含2个格子的容器,通过调用 exchanger 方法向其中的格子填充信息,当两个格子中的均被填充信息时,自动交换两个格子中的信息,然后将交换的信息返回给调用线程,从而实现两个线程的信息交换. 功能看似简单,但这在某些场景下是很有用处的,例如

  • Android利用ContentProvider初始化组件的踩坑记录

    目录 项目描述 问题排查 总结 项目描述 先简单描述一下遇到的问题. 项目比较庞大是以组件化的形式进行构建的,记录崩溃日志是由专门的一个组件去做,这里且叫它crash吧.而crash的核心逻辑如下: //伪代码 public class MyCrash implements UncaughtExceptionHandler { private static UncaughtExceptionHandler defaultUncaughtExceptionHandler; public stati

  • 利用SA FileUp组件进行多文件上传

    大家可以根据自己的实际情况进行修改,特别是数据库操作部分.============================================利用稻香老农的无组件进行多文件上传 请见:http://bbs.blueidea.com/viewthread.php?tid=1249535==================================================本例属于文件和表单项的混合提交. 简单说明:虽然重点在处理页上,但我觉得有必要介绍一下表单的项目.本例是相册里像

  • 利用微软com组件mstscax.dll实现window7远程桌面功能

    复制代码 代码如下: namespace Client{    public partial class Login : Form    {        private string ip = null; public Login()        {            InitializeComponent();        } public Login(string IP)        {            InitializeComponent();            i

随机推荐