【Angular JS】網站使用社會化評論插件,以及過程中碰到的坑


  目前正在開發自己的網站,技術上使用Angular JS + Express JS + Mongo DB。由於網站會有文章發布,因此需要有評論功能。評論功能也可以自己開發,但由於現在社會化評論插件很多,因此沒有必要多花精力,使用專業的就好。

  

1. 什么是社會化評論插件?都有哪些常用的插件?

  社會化評論插件,指的就是無需自己開發評論功能,在自己網頁上使用第三方的評論框,發出的評論將被保存在第三方的服務器上。使用時要在插件提供方官網上注冊,注冊好之后可獲取實現功能的JS代碼,以及將來可在官網上管理自己網站的評論。

  實現的原理,一般都是插件網站提供給你一段JS代碼,你插入到需要評論的網頁上即可。

  目前常用的評論插件有:

  A. Disqus

    官網:https://disqus.com/

    這個應該是最老的,在國外使用最多的第三方評論插件。優點是老牌專業,通過JS代碼可發現,國內很多網站的功能實現應該是參考了它。但缺點同樣明顯,就是國內的網站使用,訪問速度個人感覺往往不好,加載有些慢。另外對國內的社交網站支持不好,僅支持Facebook,Twitter等,不支持微博等,這對訪客的評論帶來不便。

    並且i18n對中文的支持不好,網站上提供了中文版選項(它是依賴網友們的貢獻提供多語言版本),但是我試了發現不能起作用。

    因此考慮到以上缺點,我放棄了它。

  

  B. 多說

    官網:http://duoshuo.com/

    它和有言應該是國內使用較多的評論插件。優點是使用很方便,支持微博等國內社交網站賬戶登錄。但缺點是使用過程中我感覺它的Bug還是不少,同時在其網站討論版中,可以看到,提出問題的網友很多也很活躍。比如我發現了一個嚴重的問題,也有一些網友提出,就是有時候必須手動再刷新一次頁面,才能顯示評論框。這個問題后來采用了它的動態加載方式才得以解決。

    經過對比,比較,我最后選擇的就是多說。

  

  C. 有言

    官網:http://www.uyan.cc/

    和多說很像,我沒有使用它的原因是,發現在使用時它會拋出Javascript error,導致評論框不能顯示。因此多次調試沒有解決問題后,我選擇了放棄。

 

2. 如何在Angular JS中正確使用評論插件?

  這里我還有一個需求,就是每篇文章都能講評論區分開,也就是每篇文章顯示自己的評論,評論不能串,或都顯示一樣。針對這個功能,其實每種插件都會提供線程Thread的概念,這個功能是指針對不同Thread ID的頁面加載不同的評論

  以多說為例。

  這里使用的是多說插件的動態加載方式,標准代碼可參見官網:http://dev.duoshuo.com/docs/50b344447f32d30066000147。

  在標准代碼中,有一個通用的Javascript方法,如果我有多個頁面,那么這段代碼就需要復制多次。但在Angular JS中沒有必要,Angular JS提供了Directive,即自定義標簽的功能,可定義一個directive,在每個頁面引用即可。

 

directive.js

 1 myApp.directive("comment", function() {
 2     return {
 3         restrict: 'A',
 4         link: function(scope){
 5             // get the variable from controller
 6             var article_id = scope.article_id;
 7             
 8             var data_thread_key = 'article_' + article_id;
 9             var data_url = 'article_' + article_id;
10             var data_author_key = 'http://blogtest.com/#!/article.html/' + article_id;
11             
12             // dynamic load the duoshuo comment box
13             var el = document.createElement('div');//該div不需要設置class="ds-thread"
14             el.setAttribute('data-thread-key', data_thread_key);//必選參數
15             el.setAttribute('data-url', data_url);//必選參數
16             el.setAttribute('data-author-key', data_author_key);//可選參數
17             DUOSHUO.EmbedThread(el);
18             jQuery('#comment-box').append(el);
19         }
20     };
21 });

  在這里我用每篇文章的article id來做評論插件的thread id,保證每篇文章的評論都分開。同時使用Directive的另一個好處是,directive里的JS方法,可以訪問controller中的scope變量,如果你是和我一樣在controller動態獲取文章,那么就很方便在directive中拿到文章ID。

 

page.html

1 <div id="comment-box"></div> 
2 <div comment></div>

  在html頁面中兩行代碼就足夠了。comment就是指我們自定義的Directive插件。

  

  由此可以看到評論插件的效果如下:

  

 

3. 小結

  在使用與選擇各種評論插件的過程中,自己走了很多坑。總結如下:

  1. 不同插件的產品質量不同,需要測試來發現與選擇,有的知名產品但對你來說,效果很差,當然可能有你的問題。

  2. 不同插件對不同頁面不同評論的支持不同,有的支持好,有的支持不好。像disqus,和多說支持就較好。

  3. Angular JS和插件組合使用時可能也有坑。在解決問題過程中,也可以加深對Angular JS的理解。

  

  希望對你有幫助。謝謝。

  

  我已經將自己的小網站開源,完整代碼可參見:https://github.com/kevinsong1990/nodejs-blog

 

                                           - Kevin Song

                                           2015年8月2日 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM