Angular2 ng-模板位于单独的文件中[重复]

2024-03-07

angular2如何使用不同文件中的ng-template?当我将 ng-template 放在我使用的同一个 HTML 中时,它可以工作,但是当我将 ng-template 移动到一个单独的文件中时,它就无法工作。有没有办法将 ng-template 移动到自己的文件中并在不同的 html 文件中使用它?

信息消息.html

<ng-template #messageTemplate>
    Hi
</ng-template>

<ng-container *ngTemplateOutlet="messageTemplate;"></ng-container>

上面工作正常,因为 ng-template 和用法位于同一个文件中

消息模板.html

<ng-template #messageTemplate>
    Hi
</ng-template>

信息消息.html

<ng-container *ngTemplateOutlet="messageTemplate;"></ng-container>

这是行不通的。有没有办法使用“消息模板”它位于另一个 html 内的单独文件中(例如:info-message.html)

提前致谢。


此行为可以通过“门户”来实现。这是 Angular 应用程序中一种有用且相当常见的模式。例如,您可能有一个位于顶部应用程序级别附近的全局侧边栏出口,然后子组件可以指定本地<ng-template/>,作为其整体模板的一部分,将在此位置呈现。

请注意,虽然<ng-template/>可以在定义所需插座的文件外部定义,但仍然需要放置<ng-template/>的模板内some成分。这可以是一个极简组件,仅负责包装<ng-template/>,但是它同样可能是一个复杂的组件,其中<ng-template/>兴趣只占很小的一部分。

此代码说明了门户的一种可能的基本实现。

@Directive({
  selector: '[appPortal]'
})
export class PortalDirective implements AfterViewInit {
  @Input() outlet: string;

  constructor(private portalService: PortalService, private templateRef: TemplateRef<any>) {}

  ngAfterViewInit(): void {
    const outlet: PortalOutletDirective = this.portalService.outlets[this.outlet];
    outlet.viewContainerRef.clear();
    outlet.viewContainerRef.createEmbeddedView(this.templateRef);
  }
}

@Directive({
  selector: '[appPortalOutlet]'
})
export class PortalOutletDirective implements OnInit {
  @Input() appPortalOutlet: string;

  constructor(private portalService: PortalService, public viewContainerRef: ViewContainerRef) {}

  ngOnInit(): void {
    this.portalService.registerOutlet(this);
  }
}

@Injectable({
  providedIn: 'root'
})
export class PortalService {
  outlets = new Map<string, PortalOutletDirective>();

  registerOutlet(outlet: PortalOutletDirective) {
    this.outlets[outlet.appPortalOutlet] = outlet;
  }
}

它使用三个部分工作:

  • “门户”指令。这生活在所期望的<ng-template/>并将应呈现内容的出口的名称作为输入。
  • “门户出口”指令。这存在于插座上,例如一个<ng-container/>,并定义出口。
  • “门户”服务。这是在根级别提供的,并存储对门户出口的引用,以便门户可以访问它们。

对于一些非常简单的事情来说,这似乎需要大量工作,但是一旦管道就位,就很容易(重新)使用。

<div class="container">
  <div class="row">
    <div class="col-6">
      <app-foo></app-foo>
    </div>
    <div class="col-6">
      <ng-container [appPortalOutlet]="'RightPanel'"></ng-container>
    </div>
  </div>
</div>

// foo.component.html
<h1>Foo</h1>
<ng-template appPortal [outlet]="'RightPanel'">
 <h1>RIGHT</h1>
</ng-template>

一般来说,尽管已经有经过充分测试、记录在案且稳定的实现可用,但重新发明轮子并不是一个好主意。这角度 CDK https://material.angular.io/cdk提供这样的实现 https://material.angular.io/cdk/portal我建议在实践中使用那个而不是你自己的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular2 ng-模板位于单独的文件中[重复] 的相关文章

随机推荐

  • 在 PHP 中创建日、小时、分钟和秒倒计时

    到目前为止 我已经有了这个可以倒计时天和小时的脚本 但是如何让它也可以倒计时分钟和秒呢 remaining strtotime ActiveListing ListingExpires time days remaining floor r
  • Woothemes Flexslider - 另一个 Flexslider 中的一个独特的 Flexslider - 可能吗?

    我正在使用 Woothemes 的最新 Flexslider 并且我正在尝试将一个 FlexSlider 初始化到另一个 FlexSlider 中 像这样 function initFrontpageSliders flexsliderFr
  • Spring boot:在运行时添加新端点

    我正在开发一项功能 允许 Spring Boot 应用程序具有 插件 这意味着无需新的构建 应用程序就应该能够集成新的代码片段 动态类加载是可以的 但是 对于每个新的 插件 我需要添加一个新的休息端点 我知道一些库能够在 Spring Bo
  • 根据数组生成文件列表

    我尝试了一些事情 但这周我感觉我的大脑正在度假 我需要完成这件事 所以我希望有人可以帮助我 我需要根据保存到数据库中的哈希创建一个文件列表 看起来像这样 file1 dir1 file2 dir1 subdir1 file3 输出应该是这样
  • 如何在 Groovy 中重置模拟静态方法?

    我在测试设置中有以下内容 def originalPostAsXml RestClient postAsXml RestClient metaClass static postAsXml String uriPath String xml
  • 我可以在 Jenkinsfile 中增强 scm 吗?

    我花了很长时间才明白什么checkout scm真正的意思是在 Jenkinsfile 中 checkout 是一个函数 scm 是一个默认的全局变量 现在我明白了 我想补充一下scm例如 增加特定结账的超时时间或设置sparseCheck
  • YouTube 数据 API v3 - 评论线程请求不返回总结果计数

    当我执行以下 YouTube 数据 API 请求来列出 commentThreads 时 pageInfo totalResults未在响应中返回 我预计pageInfo totalResults待退回根据文档 https develope
  • Xcode 4:从命令行(xcodebuild)运行测试?

    我在 Xcode 4 中创建了一个全新的 iOS 项目 并包含单元测试 默认应用程序有 2 个目标 主应用程序和单元测试包 使用 产品 gt 测试 Command U 构建应用程序 构建单元测试包 启动 iOS 模拟器并运行测试 现在我希望
  • 是否可以对 Grid.Column 进行动画处理?

    我可以制作动画吗Grid Column财产 我需要搬家
  • 使用 Jetpack Compose 构造环

    I am learning Jetpack Compose and would like to build something like this 我尝试过通过堆叠使用框布局CircularProgressIndicator但需要对圆圈大小
  • 如何使用模型属性作为变量 ng-click

    我希望将 ng click 的函数调用作为字符串存储在我的模型中 我无法使用 ng click m func 如果我使用 ng click m func 也不起作用 http jsfiddle net j8wW5 19 http jsfid
  • redux-saga 调用调用的函数中对“this”的引用为空

    我在学redux saga我正在尝试将其集成到一个使用 openapi generator 生成的 API 的项目中 该 API 会生成如下所示的输出 async loginUser body Login Promise
  • Pandas - 查找每个组贡献的百分比

    我试图找到每个日期组所做的百分比贡献 下面给出的是我的数据的样子 期望找到每个产品在给定日期的贡献 date product quantity 2020 01 prod a 100 2020 01 prod b 200 2020 01 pr
  • 使用 vgg16 的验证集准确性较低

    我正在为一个项目进行狗品种分类 遇到了一个我不知道如何解决的重大问题 数据集是由以下机构提供的狗的图像斯坦福狗数据集 http vision stanford edu aditya86 ImageNetDogs 我用 keras 进行数据增
  • 在 Javascript/jQuery 中动态添加表行的绑定点击事件

    问题陈述 我有一张桌子thead静态创建 并且 tr td 在tbody动态创建的 我必须实现的是 当用户单击表格上的任意位置时 我需要获取val 被单击的行的第一列 为了测试这一点 我使用绑定一个点击事件on到父元素类 即类tbody 而
  • WPF 互斥列表框

    我有一个应用程序 其中有一个列表框的列表框 我想让 InnerList 框互斥 我的 ViewModel 有一个集合 Foos 它有一个描述 一个 IsSelected 属性和一个集合 Bars 它有一个名称和 IsSelected 属性
  • android studio 中缺少模拟器工具窗口

    我的 Android Studio IDE 缺少工具窗口 模拟器 View gt 工具窗口尽管 在工具窗口中启动 选项已选中File gt Settings gt Tools gt Emulator 我不知道是什么改变了它 但它曾经正常工作
  • 无法将新生成的 Play 框架项目导入 IntelliJ IDEA 15

    当我尝试将新创建的 play 框架项目导入到我的 IntelliJ IDEA 15 时 出现以下异常 Java HotSpot TM 64 Bit Server VM warning ignoring option MaxPermSize
  • 从当前工作树创建分支并重置为 HEAD

    我目前正在开发一个功能 结果比预期的要大 所以最好创建一个分支来处理它 因此 我需要从当前工作目录创建一个新分支 并将 master 分支重置为当前 HEAD 以便可以对生产环境进行一些修复 不知何故 这听起来像是一项简单的任务 但我不太明
  • Angular2 ng-模板位于单独的文件中[重复]

    这个问题在这里已经有答案了 angular2如何使用不同文件中的ng template 当我将 ng template 放在我使用的同一个 HTML 中时 它可以工作 但是当我将 ng template 移动到一个单独的文件中时 它就无法工