日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Angular 内容投影 content projection 的一个问题的单步调试

發布時間:2023/12/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Angular 内容投影 content projection 的一个问题的单步调试 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述

我使用如下代碼測試一個最簡單的 Angular 內容投影場景:

import { Component } from '@angular/core';@Component({selector: 'app-zippy-basic',template: `<h2>Single-slot content projection</h2><ng-container></ng-container>` }) export class ZippyBasicComponent {}

我期望 app-zippy-basic 的使用者,將傳入的 content,投射到元素 ng-container 內部。

消費代碼如下圖所示:

<app-zippy-basic><p>Is content projection cool?</p><div>ok</div> </app-zippy-basic>

然而運行時,我在渲染出的頁面里,根本看不到 Is content projection cool? 的顯示。

問題分析

打開 Chrome 開發者工具,發現 app-zippy-basic 內部只有一個 comment 節點:ng-container

我們在提供內容投影插槽的 Component 的 ng-container 之間隨便鍵入一些字符串,例如 DIV:

渲染后發現,ng-container 沒能按照我們期望的工作。

通過查閱 Angular 官網,發現這里把 ng-container 和 ng-content 弄混淆了。此處應該使用 ng-content.

解決方案

ng-content 之間不允許再插入其他元素。僅僅充當一個占位符的角色。

使用 ng-content 之后問題消失。這里我們可以通過單步調試的方式,搞清楚被投影的內容是如何插入到 ng-content 占位符里的。

選擇 app-zippy-basic,給其設置一個 dom 斷點,類型為 subtree modification:

首先執行 template 函數,將 Component 本身的 h2 元素,進行 HTML 源代碼的渲染:

接下來是 Angular 處理整個內容投影邏輯的關鍵:

遇到 ng-content,則調用函數 ??projection:

轉而調用 applyProjection:

parent node 即是指定義了 ng-content 的 Component 對應的 dom 元素:

rNode 即是被插入到 app-zippy-basic 中的節點,即 app-zippy-basic 的消費者。

消費語法:

<app-zippy-basic> 此處插入你想投影到 app-zippy-basic 內部的 HTML 源代碼 </app-zippy-basic>

總結

以上是生活随笔為你收集整理的Angular 内容投影 content projection 的一个问题的单步调试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。