1

我正在使用disqus作为评论系统的主干网站,我使用主干样板,并为评论注册了一个模块,我在其中包含了DISQUS提供的js

我的模块看起来像这样:

define([
'namespace',
'use!backbone'
], function(namespace, Backbone) {

var Comment = namespace.module();

Comment.Views.CommentView = Backbone.View.extend({
    template: "app/tpl/comment/main.html",
    render: function(done) {
        var view = this;
        namespace.fetchTemplate(this.template, function(tmpl) {
            view.el.innerHTML = tmpl();
            if (_.isFunction(done)) {
                done(view.el);
            }
        });
    },
    commentScript: function() {
        console.log('Comment Script INIT.');
        var disqus_identifier = 'a unique identifier for each page where Disqus is present';
        var disqus_title = 'a unique title for each page where Disqus is present';
        var disqus_url = 'a unique URL for each page where Disqus is present';
        var disqus_developer = 1;
        var disqus_shortname = 'dandin95'; // required: replace example with your forum shortname
        /* * * DON'T EDIT BELOW THIS LINE * * */
        (function() {
            var dsq = document.createElement('script');
            dsq.type = 'text/javascript';
            dsq.async = true;
            dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';

            (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
        })();
    }
});

return Comment;

});

我的 main.html 仅包含一个 id 为“disqus_thread”的 div,用于查看评论框

我的问题是:当渲染我的视图时什么也没做,chrome 控制台显示 Uncaught TypeError: Cannot call method 'toLowerCase' of null embed.js:65

将此脚本添加到模板时,一切正常。

有什么建议吗???

4

1 回答 1

0

基本上,看起来您正在创建一个主干视图来初始化和呈现 #disqus_thread DIV 中的 DISQUS 小部件,然后根据页面的状态重新呈现:

define('disqus', [], function(){

    var disqus_shortname = DISQUS_SHORTNAME,
        disqus_identifer = INDEX_IDENT,
        disqus_title = DISCOVERY_TITLE,
        disqus_url = URL_HERE,
        disqus_developer = '1';  // could be deprecated?

    var DisqusView = Backbone.View.extend({
        el: '#disqus_thread',
        initialize: function() {
            // DISQUS universal code:
            var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
            dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
            (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
        },

        render: function(options) {

            DISQUS.reset({
                options: options,
                reload: true,
                config: function(){
                    this.page.identifer = options.identifer;
                    this.page.title = options.title;
                }
            });

        }
    });

    var disqusView = new DisqusView();

    return disqusView;
});

好的!所以让我们假设页面上已经存在#disqus_thread 元素(因此设置el)。当模块被加载时,DISQUS 会进行初始化。

假设触发了一个需要加载新 Disqus 线程的事件:

$('.article_title').on('click', function(e) {
    var $post = $(e.target).attr('id');
    disqus.render({
        identifier: $post,  // OR however you decide to determine these attributes
        title: $post
    });
});

#disqus_thread 元素中的 iFrame 然后将重新加载到正确的线程。这是一个非常薄层的示例,但想象一下disqus.render({...})在事件哈希或路由器中调用。

DISQUS Ajax 重置代码段

于 2013-09-02T22:45:25.500 回答