当前位置: 首页 > 编程笔记 >

angular6.x中ngTemplateOutlet指令的使用示例

暨宸
2023-03-14
本文向大家介绍angular6.x中ngTemplateOutlet指令的使用示例,包括了angular6.x中ngTemplateOutlet指令的使用示例的使用技巧和注意事项,需要的朋友参考一下

在使用angular进行开发的时候,通过属性绑定向组件内部传值的方式,有时候并不能完全满足需求,比如我们写了一个公共组件,但是某个模板使用这个公共组件的时候,需要在其内部添加一些标签内容,这种情况下,除了使用ngIf/ngSwitch预先在组件内部定义之外,就可以利用ngTemplateOutlet指令向组件传入内容.

ngTemplateOutlet指令类似于angularjs中的ng-transclude,vuejs中的slot.

ngTemplateOutlet是结构型指令,需要绑定一个TemplateRef类型的实例.

使用方式如下:

@Component({
 selector: 'app',
 template: `
  <h1>Angular's template outlet and lifecycle example</h1>
  <app-content [templateRef]="nestedComponentRef"></app-content>
  <ng-template #nestedComponentRef let-name>
   <span>Hello {{name}}!</span>
   <app-nested-component></app-nested-component>
  </ng-template>
 `,
})
export class App {}
@Component({
 selector: 'app-content',
 template: `
  <button (click)="display = !display">Toggle content</button>
  <template 
    *ngIf="display" 
    *ngTemplateOutlet="templateRef context: myContext">
  </template>
 `,
})
export class Content {
 display = false;
 @Input() templateRef: TemplateRef;
 myContext = {$implicit: 'World', localSk: 'Svet'};
}
@Component({
 selector: 'app-nested-component',
 template: `
  <b>Hello World!</b>
 `,
})
export class NestedComponent implements OnDestroy, OnInit {
 
 ngOnInit() {
  alert('app-nested-component initialized!');
 }
 
 ngOnDestroy() {
  alert('app-nested-component destroyed!');
 }
 
}

代码中除了跟组件外定义了两个组件

  1. 容器组件:app-content
  2. 传递进去的内容组件:app-nested-component

app-content组件接收一个TemplateRef类型的输入属性templateRef,并在模板中将其绑定到了ngTemplateOutlet指令,当组件接收到templateRef属性时,就会将其渲染到ngTemplateOutlet指令所在的位置.

上例中,app-content组件templateRef属性的来源,是在根组件的模板内,直接通过#符号获取到了app-nested-component组件所在<ng-template>的引用并传入的.

在实际应用中,除了这种方式,也可以直接在组件内部获取TemplateRef类型的属性并绑定到ngTemplateOutlet指令.

比如在容器组件为模态框的情况下,并不能通过模板传值,就可以使用下面这种方式:

 @ViewChild('temp') temp: TemplateRef<any>

 openDialog(){
  this.dialog.open(ViewDialogComponent, {data: this.temp)
 }

在容器组件中还可以定义被传递内容的上下文(上例app-content组件中的myContext属性),其中的$implicit属性作为默认值,在被传递的内容中可以以重命名的方式访问(上例let-name),对于上下文中其他的属性,就需要通过let-属性名的方式访问了.

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

 类似资料:
  • 本文向大家介绍Angular6中使用Swiper的方法示例,包括了Angular6中使用Swiper的方法示例的使用技巧和注意事项,需要的朋友参考一下 项目使用的Angular版本是V6.0.3 安装Swiper 或者 在angular.json文件添加swiper.js和swiper.css angular.json 安装模组定义档 或者 配置tsconfig文件 tsconfig.json t

  • 所以我做了这个TextArea,在这里我输入不同的命令,并用换行符将它们分开,如果其中一行有错误,我就把它写在控制台输出中。在这里,我做了一个非常简单的,也不是最好的解决方案,使这行指示,但它有点bug。 我是怎么做的 我定义了一个,在这里我可以键入不同的信息/命令,如果其中一个命令/行无效,我就把它写在控制台中,只是为了暂时显示一些内容。我基本上通过将textarea行拆分为来计算行数,然后计算

  • 问题内容: 我创建了下面的角度指令, ChildDirective ,在 ParentDirective中使用 这正常工作,并且出现了几个子指令。 我想更新 ParentDirective ,以从服务器获取 childDirective 的列表。因此,我更新了 ParentDirective 代码以进行Ajax调用,然后绘制 ChildDirectives 问题是, childDirectives

  • 本文向大家介绍Vue指令实现OutClick的示例,包括了Vue指令实现OutClick的示例的使用技巧和注意事项,需要的朋友参考一下 原始实现 下面是两种常见的模态框的实现方式 方案一:默认 click 都是放在冒泡阶段,只要在内容区域上添加 click 的阻止冒泡即可 方案二:通过代码判断点击触发的 DOM 是否在内容区域内 指令实现 上面的代码可以解决全屏的模态框点击外部区域关闭。但是还有一

  • 本文向大家介绍Angular1.x复杂指令实例详解,包括了Angular1.x复杂指令实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Angular1.x复杂指令。分享给大家供大家参考,具体如下: 名称 描述 compile 指定一个编译函数 controller 为指令创建一个控制器函数 link 为指令指定链接函数 replace 指定模板内容是否替换指令所应用到的元素 req

  • @Component({ selector: 'app-root', template: ` <div class="tabs-selection"> <tab *ngFor="let tab of tabs; let i = index" [active]="isSelected(i)" (click)="setTab(