首頁 >web前端 >js教程 >在Angular中使用MathJax碰到哪些問題?

在Angular中使用MathJax碰到哪些問題?

亚连
亚连原創
2018-06-20 16:24:551889瀏覽

這篇文章主要給大家介紹了關於Angular中使用MathJax遇到的一些問題,文中透過範例程式碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友下面來一起學習學習吧。

前言

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

MathJax簡介

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

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

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

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

這時候我開始灰心了,這個問題就沒有解決辦法了嗎?絕望之時,我想到能不能直接 Typeset document,結果是可以的,而且十分快。所以渲染不慢,可能是渲染的初始化過程比較慢。那麼這時候方案就出來了,我們可以盡量減少渲染次數,同時只渲染 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();
 }
 }
 }
}

上面是我整理給大家的,希望今後會對大家有幫助。

相關文章:

在jquery中如何實現左右輪播切換

#在jQuery中如何取得資料賦值給頁面

在three.js中如何實作3D模型展示

#Angular CLI安裝教學

在Vuejs中透過nextTick()實作非同步更新佇列

##使用ReactNative如何實作Toast

使用CommonsChunkPlugin如何做才能擷取公共模組

以上是在Angular中使用MathJax碰到哪些問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn