搜尋
首頁web前端js教程實例詳解Angular實現類似部落格評論的遞歸顯示及取得回覆評論的數據

本文主要給大家介紹了關於Angular如何實現類似博客評論的遞歸顯示及獲取回复評論的數據的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。

前言

我們在一些技術部落格中會經常看到很多遞歸評論,也即是我們可以回覆博友的評論,且界面很美觀,有梯度的顯示格式,日前在空餘時間寫類似的demo,所以記錄下來,可以給需要的人一些借鏡的作用。
好了,廢話少說,直奔主題。 。 。

思路

我們在寫後台程式的時候,常常會遇到產生類似樹的這種資料結構,我們直覺就是使用遞歸的方法來實現,起初我也是這麼想的,就是寫一個Angular4 的遞歸方法,組成一個字串,然後在介面顯示,類似下面程式碼

@Component({
 selector: "comment",
 template: '{{ comments }}'
})
export class CommentComponent {

 public comments: string = "";

 generateComment(Comment comment) {
 this.comments = this.comments + "<p>" + comment.content + "</p>";
 if (comment.pComment != null) {
  generateComment(comment.pComment);
 }
 }
}

很天真的以為可以了,結果一試,標籤不會被解析,才想起已經過了解析標籤的過程了。 。 。

後來想著,現在的前端框架都是以元件化自稱, Angular4 也不例外,那麼一個Component 可以嵌入任何Component,那肯定可以嵌入自己,也就有了類似遞歸的概念了,想到這立馬試試。 。 。

具體實現

思路是這樣子,我定義了資料的格式,是每個評論下面有一個子評論數組,而不是每個評論有一個父評論,資料格式如下:

"comments": 
  [
  {
   "id": 1,
   "username": "James1",
   "time": "2017-07-09 21:02:21",
   "content": "哈哈哈1<h1 id="哈哈哈">哈哈哈</h1>",
   "status": 1,
   "email": "1xxxx@xx.com",
   "cComments": [
    {
    "id": 2,
    "username": "James2",
    "time": "2017-07-09 21:02:22",
    "content": "哈哈哈2",
    "status": 1,
    "email": "2xxxx@xx.com",
    "cComments": null
   }
   ]
  }
  ]

CommentComponent 元件實作了評論模組,但是遞歸評論並不在這個元件實現,而是在子元件CommentViewComponent 中實現,因為CommentComponent 還包括一個輸入評論的文字方塊。

評論總模組ComponentComponent 程式碼:

comment.component.ts

@Component({
 selector: 'comment',
 templateUrl: './comment.component.html',
 styleUrls: ['./comment.component.css']
})
export class CommentComponent implements OnInit {

 @Input()
 public comments: Comment[];

 ngOnInit(): void {
 }
}

comment.component.html

<p>
 </p><p>
 </p><p>

  <comment-view></comment-view>

  </p><p>
  </p><h4 id="comment-leaveComment-translate">{{ 'comment.leaveComment' | translate }}</h4>
  
   

           

      
      

comment.component.css

.media {
 font-size: 14px;
}

.media-object {
 padding-left: 10px;
}

子模組ComponentViewComponent 程式碼:

component-view.component.ts

@Component({
 selector: 'comment-view',
 templateUrl: './comment-view.component.html',
 styleUrls: ['./comment-view.component.css']
})
export class CommentViewComponent implements OnInit {
 @Input()
 public comments: Comment[];

 constructor(private router: Router,
    private activateRoute: ActivatedRoute ) {
 }

 ngOnInit(): void {
 }
}

component-view.component.html

<p>
 </p><p>
 </p><p>
  <span></span>
 </p>
 <p>
  </p><h4>{{ comment.username }}
  <small>{{ comment.time }} | <a>{{ 'comment.reply' | translate }}</a></small>
  </h4>
  {{ comment.content }}
  <hr>
  <comment-view></comment-view>
 
 

comonent-view.component.css

.media {
 font-size: 14px;
}

.media-object {
 padding-left: 10px;
}

結果

這時的展示結果如下圖所示:

#上面只是說明如何實作註解梯形顯示,在部落格評論中我們經常看到可以回覆某一則評論,本文講述如何實現點擊某一評論的回覆按鈕後,取得該評論的內容並顯示在輸入框中。類似CSDN 部落格評論一樣,點擊回覆後輸入框自動添加了[reply]u011642663[/reply]

思路

依據上一篇文章中的評論梯形顯示,我們還需要實現點擊回覆後,螢幕自動到達輸入框位置,並且取得了點擊回覆的評論的資訊。首先分解這個功能點,在專案中我們也會經常分解功能點,這個功能點有2 個小點:一是在每個評論中加上[回覆] 按鈕,點擊回復後跳到輸入框位置;二是點擊回覆後,取得到點擊回覆的那條評論的資訊。下面我們一一解決。

跳到輸入框

我們接觸前段第一個語言便是 HTML,我們知道 HTML 中有一個 # 定位,下面程式碼簡單解釋一下。

假設這個HTML 程式碼檔案是index.html

 
 
 
 <a>Click me to pointer</a>
 <p>
  </p><h1 id="哈哈哈哈">哈哈哈哈</h1>
 
 

上面程式碼只要點擊Click me to pointer 這個鏈接,頁面就會跳到id=”pointer” 這個p 的位置。所以我們在實作這個點擊回覆跳到輸入框中就可以使用這個方法。

我們在comment-component.html 中將評論輸入框加入id=”comment”,接下來就是路徑拼接的問題了,我們可以透過Angular 的Router 的url 來取得本頁面的路徑,然後在這個路徑後面加入#comment 就可以實現跳轉了,下面是實現這個跳轉功能的程式碼

新增id=”comment”

#comment-component.html


<p>
 </p><p>
 </p><p>

  <comment-view></comment-view>

  </p><p>
  </p><h4 id="comment-leaveComment-translate">{{ 'comment.leaveComment' | translate }}</h4>
  
   

           

      
      

新增透過路由取得目前頁面URL

comment-view.component.ts

@Component({
 selector: 'comment-view',
 templateUrl: './comment-view.component.html',
 styleUrls: ['./comment-view.component.css']
})
export class CommentViewComponent implements OnInit {
 @Input()
 public comments: Comment[];

 // 用于跳转到回复输入框的url拼接
 public url: string = "";

 constructor(private router: Router,
    private activateRoute: ActivatedRoute ) {
 }

 ngOnInit(): void {
 this.url = this.router.url;
 this.url = this.url.split("#")[0];
 this.url = this.url + "#comment";
 }
}

新增連結href=」「

comment-view.component .html

<p>
 </p><p>
 </p><p>
  <span></span>
 </p>
 <p>
  </p><h4>{{ comment.username }}
  <small>{{ comment.time }} | <a>{{ 'comment.reply' | translate }}</a></small>
  </h4>
  {{ comment.content }}
  <hr>
  <comment-view></comment-view>
 
 

這實現了頁面跳躍的功能點,接下來實現回應的評論的資訊。

取得回覆的評論訊息

有人会说获取回复的评论信息,这不简单么?加个 click 事件不就行了。还记得上一篇文章咱们是如何实现梯形展示评论的么?咱们是通过递归来实现的,怎么添加 click 事件让一个不知道嵌了多少层的组件能够把评论信息传给父组件?首先不具体想怎么实现,我们这个思路是不是对的:把子组件的信息传给父组件?答案是肯定的,我们就是要把不管嵌了多少层的子组件的信息传给 comment.component.ts 这个评论模块的主组件。
Angular 提供了 @Output 来实现子组件向父组件传递信息,我们在 comment-view.component.ts 模块中添加 @Output 向每个调用它的父组件传信息,我们是嵌套的,这样一层一层传出来,直到传给 comment-component.ts 组件。我们看代码怎么实现。

实现代码

comment-view.component.ts

@Component({
 selector: 'comment-view',
 templateUrl: './comment-view.component.html',
 styleUrls: ['./comment-view.component.css']
})
export class CommentViewComponent implements OnInit {
 @Input()
 public comments: Comment[];
 // 点击回复时返回数据
 @Output()
 public contentEvent: EventEmitter<comment> = new EventEmitter<comment>();
 // 用于跳转到回复输入框的url拼接
 public url: string = "";

 constructor(private router: Router,
    private activateRoute: ActivatedRoute ) {
 }

 ngOnInit(): void {
 this.url = this.router.url;
 this.url = this.url.split("#")[0];
 this.url = this.url + "#comment";
 }

 reply(comment: Comment) {
 this.contentEvent.emit(comment);
 }

 transferToParent(event) {
 this.contentEvent.emit(event);
 }
}</comment></comment>

comment-view.component.html

<p>
 </p><p>
 </p><p>
  <span></span>
 </p>
 <p>
  </p><h4>{{ comment.username }}
  <small>{{ comment.time }} | <a>{{ 'comment.reply' | translate }}</a></small>
  </h4>
  {{ comment.content }}
  <hr>
  <comment-view></comment-view>
 
 

comment.component.ts

@Component({
 selector: 'comment',
 templateUrl: './comment.component.html',
 styleUrls: ['./comment.component.css']
})
export class CommentComponent implements OnInit {

 @Input()
 public comments: Comment[];

 // 要回复的评论
 public replyComment: Comment = new Comment();

 public id: number = 0;
 public content: string = "";

 ngOnInit(): void {
 }

 getReplyComment(event) {
 this.replyComment = event;
 this.id = this.replyComment.id;
 this.content = "[reply]" + this.replyComment.username + "[reply]\n";
 }
}

comment.component.html


<p>
 </p><p>
 </p><p>

  <comment-view></comment-view>

  </p><p>
  </p><h4 id="comment-leaveComment-translate">{{ 'comment.leaveComment' | translate }}</h4>
  
   

           

      
      

解释一下代码逻辑:

我们在 comment-view.component.ts 添加以下几点:

  • 定义了@Output() contentEvent

  • 添加了reply(comment: Comment) 事件在点击回复的时候触发的,触发的时候 contentEvent 将 comment 传到父模块

  • 添加 transferToParent(event) 是接受子组件传来的 event, 并且继续将 event 传到父组件

在 comment.component.ts 中定义了 getReplyComment(event) 方法,该方法接收子组件传递来的评论信息,并将信息显示在页面上。大功告成。。。

效果图

相关推荐:

怎样用PHP开发博客评论系统!解决办法

博客评论回访者跟踪

如何PHP制作简易博客

以上是實例詳解Angular實現類似部落格評論的遞歸顯示及取得回覆評論的數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JavaScript框架:為現代網絡開發提供動力JavaScript框架:為現代網絡開發提供動力May 02, 2025 am 12:04 AM

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

node.js流帶打字稿node.js流帶打字稿Apr 30, 2025 am 08:22 AM

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python vs. JavaScript:性能和效率注意事項Python vs. JavaScript:性能和效率注意事項Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript的起源:探索其實施語言JavaScript的起源:探索其實施語言Apr 29, 2025 am 12:51 AM

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

幕後:什麼語言能力JavaScript?幕後:什麼語言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來:趨勢和預測Python和JavaScript的未來:趨勢和預測Apr 27, 2025 am 12:21 AM

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python vs. JavaScript:開發環境和工具Python vs. JavaScript:開發環境和工具Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器