欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Angular中使用MathJax遇到的一些問題

 更新時間:2017年12月15日 09:34:51   作者:神奇魔法咸魚堂  
這篇文章主要給大家介紹了關于Angular中使用MathJax遇到的一些問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友下面來一起學習學習吧。

前言

話說我本來是傾向于 KaTeX 的,因為我感覺他很快,而且 MathJax 似乎很難配。但是大家表示對缺少功能的 KaTeX 并無好感,給我提供了一些鉆研 MathJax 的動力。

MathJax簡介

MathJax是一款運行在瀏覽器中的開源數(shù)學符號渲染引擎,使用MathJax可以方便的在瀏覽器中顯示數(shù)學公式,不需要使用圖片。目前,MathJax可以解析Latex、MathML和ASCIIMathML的標記語言。MathJax項目于2009年開始,發(fā)起人有American Mathematical Society, Design Science等,還有眾多的支持者,個人感覺MathJax會成為今后數(shù)學符號渲染引擎中的主流,也許現(xiàn)在已經(jīng)是了。

個人其實也不算鉆研,因為實際上 MathJax 很簡單,調(diào)用 MathJax.Hub.Queue(['Typeset', MathJax.Hub, this.element.nativeElement]); 就可以渲染一個元素(這個 this.element.nativeElement 是從 Angular 中調(diào)用它 DOM 的語法),這個 .Queue 實際上是 MathJax 自己實現(xiàn)的回調(diào)格式,語法非常清奇,參數(shù)個數(shù)不定,每個都是數(shù)組,代表一個回調(diào),順序執(zhí)行。比如這個 ['Typeset', MathJax.Hub, this.element.nativeElement] ,第一個元素是方法名,第二個元素是 this ,之后的元素都是參數(shù)……

我們可以看到這個就相當于執(zhí)行 MathJax.Hub.Typeset(this.element.nativeElement) ,那為啥不執(zhí)行這個?因為這方法是同步的,會導致頁面十分卡。于是 MathJax 就自己封裝了一個異步隊列(它的 API 可能幾百年沒改了)

我們說回 Angular。因為要用 markdown,我的思路是用 marked 封裝一個 directive。那么我們就應該在 marked 渲染完成之后用 MathJax 去 Typeset 這個組件。但真的這樣做了,卻產(chǎn)生了奇妙的效果——切換頁面之后,要等將近一分鐘才開始渲染。我在它的隊列里放了幾個 log,發(fā)現(xiàn)每個元素都被 queue 了 4 次,幾十個元素,難怪要一分鐘才開始渲染下一頁的內(nèi)容,即使大部分 markdown 里面根本沒有數(shù)學。

這時候我開始灰心了,這個問題就沒有解決辦法了嗎?絕望之時,我想到能不能直接 Typeset document,結果是可以的,而且十分快。所以渲染并不慢,可能是渲染的初始化過程比較慢。那么這時候方案就出來了,我們可以盡量減少渲染次數(shù),同時只渲染 document。只要這個渲染還在進行,那么有再多的元素 queue 上來,我們也只當作 queue 了一次。

于是我就寫了這么個 service:

@Injectable()
export class MathjaxService {
 public isQueued = false;
 public isRunning = false;
 window: any;
 constructor(@Inject(PLATFORM_ID) private platformId: Object) {
 if (isPlatformBrowser(this.platformId)) {
 this.window = window as any;
 }
 }
 finishRunning() {
 this.isRunning = false;
 if (this.isQueued) {
 this.queueChange();
 }
 }
 queueChange() {
 if (this.isRunning) {
 this.isQueued = true;
 } else {
 this.isQueued = false;
 this.isRunning = true;
 if (isPlatformBrowser(this.platformId)) {
 if (this.window.MathJax) {
  this.window.MathJax.Hub.Config({
  messageStyle: 'none',
  tex2jax: {
  // preview: 'none',
  inlineMath: [['$', '$']],
  processEscapes: true
  }
  });
  this.window.MathJax.Hub.Queue(['log', console, 'start'], ['Typeset', this.window.MathJax.Hub, document], ['log', console, 'end'], ['finishRunning', this]);
 }
 } else {
 this.finishRunning();
 }
 }
 }
}

事實證明,它能圓滿完成任務,它也就是現(xiàn)在運行在 這個網(wǎng)站 上的代碼。

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • AngularJS 表達式詳解及實例代碼

    AngularJS 表達式詳解及實例代碼

    這篇文章主要介紹了AngularJS 表達式,這里整理了詳細的資料,有需要的小伙伴可以參考下
    2016-09-09
  • angularJS提交表單(form)

    angularJS提交表單(form)

    這篇文章主要介紹了angularJS提交表單(form)的方法和示例,需要的朋友可以參考下
    2015-02-02
  • Angular 1.x個人使用的經(jīng)驗小結

    Angular 1.x個人使用的經(jīng)驗小結

    這篇文章主要給大家介紹了關于Angular 1.x個人使用的一些經(jīng)驗,屬于一些基礎入門教程,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • 詳解angular用$sce服務來過濾HTML標簽

    詳解angular用$sce服務來過濾HTML標簽

    這篇文章主要介紹了詳解angular用$sce服務來過濾HTML標簽,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • 詳解Angular項目中共享模塊的實現(xiàn)

    詳解Angular項目中共享模塊的實現(xiàn)

    本文主要介紹了Angular的共享模塊的實現(xiàn),對此感興趣的同學,可以實驗一下
    2021-05-05
  • Angular.js自定義指令學習筆記實例

    Angular.js自定義指令學習筆記實例

    這篇文章主要介紹了Angular.js自定義指令的實例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • 簡介AngularJS中使用factory和service的方法

    簡介AngularJS中使用factory和service的方法

    這篇文章主要簡單介紹了AngularJS中使用factory和service的方法,主要針對自定義工廠和服務的創(chuàng)建來講,需要的朋友可以參考下
    2015-06-06
  • AngularJS的內(nèi)置過濾器詳解

    AngularJS的內(nèi)置過濾器詳解

    在我們開發(fā)中經(jīng)常需要在頁面顯示給用戶的信息需要一定處理格式化,才能顯示給用戶。在angularjs中為我們提供了叫filter的指令,讓我們能夠很輕易就能做到著一些列的功能,angularjs內(nèi)部為我們提供了number等很多內(nèi)置的filter。
    2015-05-05
  • Angular的$http與$location

    Angular的$http與$location

    這篇文章主要為大家詳細介紹了Angular的$http與$location,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • AngulaJS路由 ui-router 傳參實例

    AngulaJS路由 ui-router 傳參實例

    本篇文章主要介紹了AngulaJS路由 ui-router 傳參實例 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04

最新評論