返回顶部
首页 > 资讯 > 前端开发 > JavaScript >angular中怎么进行内容投影
  • 401
分享到

angular中怎么进行内容投影

2024-04-02 19:04:59 401人浏览 薄情痞子
摘要

这篇文章主要介绍“angular中怎么进行内容投影”,在日常操作中,相信很多人在angular中怎么进行内容投影问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”angular中

这篇文章主要介绍“angular中怎么进行内容投影”,在日常操作中,相信很多人在angular中怎么进行内容投影问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”angular中怎么进行内容投影”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

angular中怎么进行内容投影

一、 ng-content 进行内容投影

1.1 ng-content

ng-content 元素是一个用来插入外部或者动态内容的占位符。父组件将外部内容传递给子组件,当 Angular 解析模板时,就会在子组件模板中 ng-content 出现的地方插入外部内容。

我们可以使用内容投影来创建可重用的组件。这些组件有相似的逻辑和布局,并且可以在许多地方使用。一般我们在封装一些公共组件的时候经常会用到。

1.2 为什么使用内容投影

定义一个 button 组件:

button-component.ts

@Component({
    selector: '[appButton]',
    template: `
    <span class="icon-search"></span>
`
})
export class AppButtonComponent {}

这个 button 组件的目的是在按钮内部加一个搜索的图标,我们实际使用如下:

<button appButton>click</button>

我们发现组件只会展示搜索图标, 按钮的文本不会展示,能你会想到最常使用的 @Input 装饰器,但是如果我们不只是想传文本进来,而是传一段 html 进来呢?此时就会用到 ng-content

1.3 单插槽内容投影

内容投影的最基本形式是单插槽内容投影

单插槽内容投影是指创建一个组件,我们可以在其中投影一个组件。

以 button 组件为例,创建一个单槽内容投影:

button-component.ts

@Component({
    selector: '[appButton]',
    template: `
    <span class="icon-search"></span> <ng-content></ng-content>
`
})
export class AppButtonComponent {}

实际使用如下:

<button appButton>click</button>

可以发现,现在这个 button 组件的效果是即显示了搜索图标,又显示了按钮的文本(click)。即把 <button appButton></button> 中间的内容 投影 到了组件的 <ng-content></ng-content> 位置。

ng-content 元素是一个占位符,它不会创建真正的 DOM 元素。ng-content 的那些自定义属性将被忽略。

1.4 多插槽内容投影

一个组件可以具有多个插槽,每个插槽可以指定一个 CSS 选择器,该选择器会决定将哪些内容放入该插槽。该模式称为多插槽内容投影。使用此模式,我们必须指定希望投影内容出现在的位置。可以通过使用 ng-contentselect 属性来完成此任务。

  • 组件模板含有多个 ng-content 标签。

  • 为了区分投影的内容可以投影到对应 ng-content 标签,需要使用 ng-content 标签上的 select 属性作为识别。

  • select 属性支持标签名属性CSS 类 :not 伪类的任意组合。

  • 不添加 select 属性的 ng-content 标签将作为默认插槽。所有未匹配的投影内容都会投影在该 ng-content 的位置。

以 button 组件为例,创建一个多槽内容投影:

button-component.ts

@Component({
    selector: '[appButton]',
    template: `
    <span class="icon-search"></span> <ng-content select="[shuxing]"></ng-content> <ng-content select="p"></ng-content> <ng-content select=".lei"></ng-content>
`
})
export class AppButtonComponent {}

实际使用如下:

<button appButton>
<p>click</p> <span shuxing>me</span> <span class="lei">here</span>
</button>

1.5 ngProjectAs

在某些情况下,我们需要使用 ng-container 把一些内容包裹起来传递到组件中。大多数情况是因为我们需要使用结构型指令像 ngIf 或者 ngSwitch 等。。

在下面的例子中,我们将 header 包裹在了 ng-container 中。

@Component({
    selector: 'app-card',
    template: `
		<div class="card">
		  <div class="header">
		    <ng-content select="header"></ng-content>
		  </div>
		  <div class="content">
		    <ng-content select="content"></ng-content>
		  </div>
		  <div class="footer">
		    <ng-content select="footer"></ng-content>
		  </div>
		  <ng-content></ng-content>
		</div>
`
})
export class AppCardComponent {}

使用:

<app-card>
  <ng-container>
    <header>
      <h2>Angular</h2>
    </header>
  </ng-container>
  <content>One framework. Mobile & desktop.</content>
  <footer><b>Super-powered by Google </b></footer>
</app-card>

由于 ng-container 的存在,header 部分并没有被渲染到我们想要渲染的插槽中,而是渲染到了没有提供任何 selectorng-content 中。
在这种情况下,我们可以使用 ngProjectAs 属性。
在上面的 ng-container 加上这个属性,就可以按照我们的期望来渲染了。

<app-card>
  <ng-container ngProjectAs='header'>
    <header>
      <h2>Angular</h2>
    </header>
  </ng-container>
  <content>One framework. Mobile & desktop.</content>
  <footer><b>Super-powered by Google </b></footer>
</app-card>

二、 有条件的内容投影

如果你的元件需要有条件地渲染内容或多次渲染内容,则应配置该元件以接受一个 ng-template 元素,其中包含要有条件渲染的内容。

在这种情况下,不建议使用 ng-content 元素,因为只要元件的使用者提供了内容,即使该元件从未定义 ng-content 元素或该 ng-content 元素位于 ngIf 语句的内部,该内容也总会被初始化。

使用 ng-template 元素,你可以让元件根据你想要的任何条件显式渲染内容,并可以进行多次渲染。在显式渲染 ng-template 元素之前,Angular 不会初始化该元素的内容。

2.1 ng-container

既不是一个组件,也不是一个指令,仅仅是一个特殊的tag而已。 使用 ng-container 渲染所包含的模板内容,不包含自身。

  • angular代码片段

<div>
  <ng-container>
    <p>My name is wyl.</p>
    <p>What is you name?</p>
  </ng-container>
</div>
  • 浏览器调试窗口,可以发现 <ng-container> 标签消失了,并没有起任何作用

<div>
  <p>My name is wyl.</p>
  <p>What is you name?</p>
</div>
  • 使用场景,如下,在我们需要遍历if 判断 时,它可以承担一个载体的作用

<ul>
  <ng-container *ngFor="let item of items">
    <li>{{ item .name}}</li>
    <li>{{ item .age}}</li>
    <li>{{ item .sex}}</li>
  </ng-container>
</ul>

另外,ng 中常见错误之一的 forif 不能写在同一标签上(在一个宿主元素上只能应用一个结构型指令),利用 ng-container 标签可以在实现功能的基础上减少层级的嵌套。

2.2 ng-template

先来看下面一段代码

<ng-template>
    <p> In template, no attributes. </p>
</ng-template>

<ng-container>
    <p> In ng-container, no attributes. </p>
</ng-container>

浏览器输出结果是:

In ng-container, no attributes.

<ng-template> 中的内容不会显示。当在上面的模板中添加 ngIf 指令:

<ng-template [ngIf]="true">
   <p> ngIf with a ng-template.</p>
</ng-template>

<ng-container *ngIf="true">
   <p> ngIf with an ng-container.</p>
</ng-container>

浏览器输出结果是:

ngIf with a ng-template.
ngIf with an ng-container.

2.3 ng-template<ng-container> 的配合使用

<ng-container *ngIf="showSearchBread; else tplSearchEmpty">
     暂时搜索不到您要的数据喔
</ng-container>
<ng-template #tplSearchEmpty>
     快快开始获取吧!
</ng-template>

2.4 ngTemplateOutlet

插入 ng-template 创建的内嵌视图。 ngTemplateOutlet 是一个结构型指令,接收一个 TemplateRef 类型的值;

<div *ngTemplateOutlet="tpl1"></div>
<ng-template #tpl1>
  <span>I am span in template {{title}}</span>
</ng-template>

*ngTemplateOutlet = "templateRefExp; content: contentExp "

  • templateRefExp: ng-template 元素的 #ID

  • contextExp:

    • 可空参数

    • content 是一个对象,这个对象可以包含一个 $implicitkey 作为默认值, 使用时在 模板 中用 let-key 语句进行绑定

    • content 的非默认字段需要使用 let-templateKey=contenTKEy 语句进行绑定

使用如下:

@Component({
  selector: 'ng-template-outlet-example',
  template: `
    <ng-container *ngTemplateOutlet="greet"></ng-container>
    <hr>
    <ng-container *ngTemplateOutlet="eng; context: myContext"></ng-container>
    <hr>
    <ng-container *ngTemplateOutlet="svk; context: myContext"></ng-container>
    <hr>
    <ng-template #greet><span>Hello</span></ng-template>
    <ng-template #eng let-name><span>Hello {{name}}!</span></ng-template>
    <ng-template #svk let-person="localSk"><span>Ahoj {{person}}!</span></ng-template>
`
})
class NgTemplateOutletExample {
  myContext = {$implicit: 'World', localSk: 'Svet'};
}

2.5 利用 ngTemplateOutlet 进行内容投影

@Component({
    selector: 'app-card',
    template: `
		<div class="card">
		  <div class="header">
		  	<ng-container *ngTemplateOutlet="headerTemplate; context: { $implicit: title, index: otherDate }"></ng-container>
		  </div>
		</div>
`
})
export class AppCardComponent {

	@ContentChild('header', { static: true }) headerTemplate: TemplateRef<any>;

	public title = 'Test';
	public otherDate = {
	 	auth: 'me',
	 	name: 'appCard'
	};
}

使用

<app-card>
  <ng-template #header let-label let-item="otherDate">
    <h2>Angular</h2> {{label}} (Test) and  {{otherDate | JSON}} ({auth: 'me', name: 'appCard'})
  </ng-template>
</app-card>

到此,关于“angular中怎么进行内容投影”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: angular中怎么进行内容投影

本文链接: https://lsjlt.com/news/97737.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • angular中怎么进行内容投影
    这篇文章主要介绍“angular中怎么进行内容投影”,在日常操作中,相信很多人在angular中怎么进行内容投影问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”angular中...
    99+
    2024-04-02
  • Angular怎么使用ng-content进行内容投影
    小编给大家分享一下Angular怎么使用ng-content进行内容投影,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • angular内容投影怎么实现
    这篇文章主要讲解了“angular内容投影怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“angular内容投影怎么实现”吧!单内容投影利用ng-content来实现<!--&n...
    99+
    2023-06-22
  • angular内容投影详解
    目录单内容投影多内容投影单个条件的内容投影app-persons - htmlapp-persons - ts使用效果图多个条件内容投影appChildRef 调整app-perso...
    99+
    2024-04-02
  • angular中的内容投影有哪几种
    本篇内容介绍了“angular中的内容投影有哪几种”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!单插槽内容...
    99+
    2024-04-02
  • 如何使用Angular组件实现内容投影
    这篇文章给大家介绍如何使用Angular组件实现内容投影,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. 投影一块内容容器组件这样写<div>   编...
    99+
    2024-04-02
  • 使用Angular组件怎么实现投影
    本篇文章为大家展示了使用Angular组件怎么实现投影,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、子组件中使用<ng-content>指令来标记投影点<div cl...
    99+
    2023-06-15
  • 如何进行Photoshop投影与CSS中box-shadow的转换
    本篇文章给大家分享的是有关如何进行Photoshop投影与CSS中box-shadow的转换,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。te...
    99+
    2024-04-02
  • linux中怎么连接投影机
    这篇文章将为大家详细讲解有关linux中怎么连接投影机,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。方案一: 一般来说,需要笔记本当前使用的分辨率和投影仪的分辨率相同,才能在投影仪上显示笔记...
    99+
    2023-06-13
  • Node.js 中怎么对文本内容进行分词
    今天就跟大家聊聊有关Node.js 中怎么对文本内容进行分词,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。nodejieba 的安装和使用十分简单:...
    99+
    2024-04-02
  • Angular怎么进行视图封装
    本篇内容主要讲解“Angular怎么进行视图封装”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Angular怎么进行视图封装”吧!在日常工作中,当我们定义一个C...
    99+
    2024-04-02
  • angular怎么进行性能优化
    这篇“angular怎么进行性能优化”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“angu...
    99+
    2024-04-02
  • vbs中怎么对文本文件内容进行排序
    vbs中怎么对文本文件内容进行排序,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。问:您好,脚本专家!我有一个包含计算机名称列表的文本文件。如何按照字母顺序对该文件进行排序?--...
    99+
    2023-06-08
  • 怎么在Android中利用SpannableString对内容进行格式化
    这篇文章将为大家详细讲解有关怎么在Android中利用SpannableString对内容进行格式化,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。要实现的效果:将话题进行变色并且可以点击提示...
    99+
    2023-05-31
    android spannablestring les
  • 怎么在Android中利用EditText对内容进行分割输入
    怎么在Android中利用EditText对内容进行分割输入?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。自定义EditTextpublic class ContentWi...
    99+
    2023-05-31
    android edittext roi
  • Python怎么将内容进行base64编码与解码
    这篇文章主要讲解了“Python怎么将内容进行base64编码与解码”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python怎么将内容进行base64编码与解码”吧!一、需求说明需要使用P...
    99+
    2023-07-05
  • 怎么用Python对Word文件内容进行读取
    今天小编给大家分享一下怎么用Python对Word文件内容进行读取的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。利用 pyt...
    99+
    2023-06-30
  • Angular怎么对请求进行拦截封装
    这篇“Angular怎么对请求进行拦截封装”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“A...
    99+
    2024-04-02
  • C语言中怎么用OpenCV实现柱面投影
    在C语言中使用OpenCV实现柱面投影的步骤如下: 导入OpenCV库: #include <opencv2/core/c...
    99+
    2024-04-02
  • linux怎么对文本或输出内容进行过滤
    这篇文章主要讲解了“linux怎么对文本或输出内容进行过滤”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux怎么对文本或输出内容进行过滤”吧!在linux中经常需要对文本或输出内容进行...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作