什么是 ng-template 以及为什么我要将 *ngIf then else 绑定到它?

2024-05-24

当我将 *ngIf 与 then 和/或 else 语句一起使用时,为什么我必须绑定到附加到ng-template元素?例如:

这有效:

<div *ngIf="show; else elseBlock">Text to show</div>
<ng-template #elseBlock>Alternate text while primary text is hidden</ng-template>

但这不起作用:

<div *ngIf="show; else elseBlock">Text to show</div>
<div #elseBlock>Alternate text while primary text is hidden</div>

我还注意到添加一个类也不起作用:

<ng-template #elseBlock class="my-class">
  Alternate text while primary text is hidden
</ng-template>

有什么特别之处ng-template?有什么不同?


这是因为 Angular 中的所有结构指令都会创建嵌入视图。使用两者创建嵌入视图templateRef and viewContainerRef。您可以在以下位置阅读有关它们的更多信息使用 ViewContainerRef 探索 Angular DOM 操作技术 https://hackernoon.com/exploring-angular-dom-abstractions-80b3ebcfc02.

嵌入视图类似于为组件创建的宿主视图。视图包含您在组件模板中或在组件模板中看到的所有节点ng-template标签。所以嵌入视图就像一个没有组件类的组件模板。以下是结构指令如何创建嵌入视图的几个示例。

ngIf

  private _updateView() {
    if (this._context.$implicit) {
      ...
        if (this._thenTemplateRef) {
          this._thenViewRef =
              // here embedded view is created
              this._viewContainer.createEmbeddedView(this._thenTemplateRef, this._context);
        }
      }
    } else {
      if (!this._elseViewRef) {
       ...
          this._elseViewRef =
              // here embedded view is created
              this._viewContainer.createEmbeddedView(this._elseTemplateRef, this._context);
        }
      }
    }
  }

ngFor

  private _applyChanges(changes: IterableChanges<T>) {
    const insertTuples: RecordViewTuple<T>[] = [];
    changes.forEachOperation(
        (item: IterableChangeRecord<any>, adjustedPreviousIndex: number, currentIndex: number) => {
          if (item.previousIndex == null) {
            // here embedded view is created
            const view = this._viewContainer.createEmbeddedView(
                this._template, new NgForOfContext<T>(null !, this.ngForOf, -1, -1), currentIndex);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是 ng-template 以及为什么我要将 *ngIf then else 绑定到它? 的相关文章

随机推荐

  • 当移动到另一个 Activity 时,在 Android 中保存 Activity [重复]

    这个问题在这里已经有答案了 可能的重复 如何保存 Android 应用程序的状态 https stackoverflow com questions 151777 how do i save an android applications
  • JSP编译时'tmpFile.renameTo(classFile) failed'的原因

    最近 我开始在 JBOss 4 0 5 JSP 应用程序中遇到奇怪的行为 JSP 编译在第一次 第二次 第三次 尝试时失败 但出现异常 17 24 29 909 ERROR jsp Servlet service for servlet j
  • EF4 Code First:如何在不添加导航属性的情况下添加关系

    我应该如何使用 Code First 但不使用任何导航属性来定义关系 之前 我通过在关系的两端使用导航属性来定义一对多和多对多 并在数据库中创建适当的关系 这是类的精简版本 为了简单起见 我已将多对多关系转换为一对多关系 public cl
  • 在 Vue.js 2 中将 props 作为初始数据传递的正确方法是什么?

    所以我想将 props 传递给 Vue 组件 但我希望这些 props 将来会从该组件内部发生变化 例如当我使用 AJAX 从内部更新该 Vue 组件时 所以它们仅用于组件的初始化 My cars listVue 组件元素 我将具有初始属性
  • 将 Rails 更新到特定版本

    如何将 Rails 更新到特定版本 我的本地计算机上有 Rails 3 2 2 但我需要更新到版本 3 2 3 如果我执行gem update rails 将会更新到最新的3 2 6版本 我怎样才能做到这一点 gem install rai
  • 如何在 Firefox 30 上调试 Greasemonkey 脚本?

    我一直在为 Youtube 开发一个 JavaScript 片段 它使用 Greasemonkey 并且还导入 Bootstrap 和 jQuery 库 该应用程序必须为每个搜索列表结果添加一个按钮 当用户单击该按钮时 它必须带出用户从其频
  • 打印对象的键和值

    我想从 javascript 对象打印一个键 值对 我的数组中可以有不同的键 因此无法将其硬编码为 object 0 key1 var filters user abc application xyz console log Object
  • get.put 和 get.lazyput 之间的区别

    我是新来的Getx的依赖注入 有人可以向我解释一下它的好处吗 Get put and Get lazyPut 并告诉我它们有什么区别 简短回答 Get put 会放立即地 Get lazyPut 会放在什么时候你需要它
  • 如何在 Angular 8 中使用本地字体系列?

    我的 assets font 文件夹中有一些自定义字体 假设它是 ITC Charter Com Black 我有四种文件 eot svg tff woff 以及如何在我的项目中使用这些字体 我累了 font family ITC Char
  • 使用实体框架、代码优先方法解决结构问题

    我目前正在使用 EF 和代码优先方法从现有系统构建数据库 最好对 核心 类进行最小的更改 因此 我想找到 Structs 和 EF 的解决方法 是否可以以任何方式将 Struct 包装到类中 以便 EF 可以使用此 Struct 中的数据
  • 如何处理多个连接

    我有一个复杂的查询 需要总共 4 个表中的字段 内部联接导致查询花费的时间比应有的时间长得多 我已经运行了一个 EXPLAIN 语句 其可视化结果附在下面 这是我的查询 SELECT pending corrections correcte
  • React Native 的捆绑包是什么?它的用途是什么?

    我试图了解该捆绑包到底是什么以及它的目的是什么 我可以或不能用它做什么 我看到 当您运行命令 react native start 时 打包程序将被初始化 当您使用 react native run android 或 run ios 在设
  • 在 MLMediaLibrary 中加载媒体源时出错

    我在加载时遇到错误mediaSourcesMac OS X 中的属性 我正在尝试使用以下方法获取 Apple Photos 源MLMediaLibrary class 我的应用程序是沙盒的 并且具有图片文件夹的只读权限 我收到错误 MLMe
  • JavaScript 执行 Ruby 脚本

    服务器 客户端是同一个盒子 创建一个 UI 以在本地运行 ruby 测试脚本 我想要执行 ActiveXObject 之类的东西 w new ActiveXObject WScript Shell w run test rb 文件结构如下
  • 使用 Typescript 时的 MongoDB FindOptions

    我正在将 JS 项目转换为 TS 并且在查询集合时遇到 FindOptions 问题 我只想获取集合中所有元素的 ID 这是导致 TS 错误的 TS 代码 import Collection Db Document MongoClient
  • 模拟适用于 Android 的 AWS Amplify Auth API

    我的 Android 应用程序使用AWS Cognito 和 Amplify 身份验证开发工具包用于身份验证 我正在尝试为登录 注册流程编写 JUnit 测试用例 我正在使用 Mockito 框架来模拟类 我从登录开始 我的登录模型如下所示
  • 如果需要保守是什么?

    C 23即将推出if consteval 这将用在哪里以及它与constexpr if if consteval检测是否constexpr函数在常量表达式上下文中调用 这proposal http www open std org jtc1
  • 使用插入符号完全可重现的并行模型

    当我在插入符中运行 2 个随机森林时 如果设置随机种子 我会得到完全相同的结果 library caret library doParallel set seed 42 myControl lt trainControl method cv
  • javascript 中的 RSA 不再支持 ASCII/字节数组

    我正在使用 rsa js v1 0http www cs students stanford edu tjw jsbn http www cs students stanford edu tjw jsbn 在浏览器中加密 ASCII 字符串
  • 什么是 ng-template 以及为什么我要将 *ngIf then else 绑定到它?

    当我将 ngIf 与 then 和 或 else 语句一起使用时 为什么我必须绑定到附加到ng template元素 例如 这有效 div Text to show div