gpt4 book ai didi

ember.js - 将 disqus 与 emberjs 集成仅适用于第一页加载

转载 作者:行者123 更新时间:2023-12-04 02:04:49 25 4
gpt4 key购买 nike

我正在运行 ember-1.0.0-rc.5 并为我传递文章 ID 的 disqus 评论创建了一个 View 。

我的问题是 disqus 不知道我何时从一页切换到另一页。

这是 View 代码:

App.DisqusView = Ember.View.extend({
tagName: 'div',
elementId: 'disqus_thread',
didInsertElement: function(){
var root_url = "http://my-root-url.herokuapp.com"
var page_id = this.get('identifier');

/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
var disqus_identifier = "item-" + page_id;
console.log(disqus_identifier);
/ this outputs the correct id/

var disqus_title = "the song title" ;
console.log(disqus_title);
/ this outputs the correct title/

var disqus_url = root_url + '/#/song/' + page_id;
console.log(disqus_url);
/ this outputs the correct url for the page/

var disqus_shortname = 'example';

/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
}
});

这是在我的 Handlebars 模板中:
{{view App.DisqusView identifierBinding="id"}}

因此,评论会在所有页面上呈现,但一条评论会保留在所有页面上,就好像 disqus 认为它​​们都是同一页面。

我正在记录 page_id 和 url,以确保我给 disqus 提供了正确的 url。

同样,当我从一个页面单击到另一个页面时,当两者都有 disqus 时,控制台会吐出一堆 disqus 错误:
DISQUS assertion failed: Unsafe attempt to redefine existing module: stringify [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: parse [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: domready [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: on [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: once [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: off [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: trigger [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: stopListening [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: listenTo [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: listenToOnce [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: bind [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: unbind [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: getShortnameFromUrl [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: getForum [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: isSSL [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: guessThreadTitle [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: getContrastYIQ [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: colorToHex [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: getElementStyle [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: getAnchorColor [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: normalizeFontValue [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: isSerif [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: getBrowserSupport [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: getPermalink [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: expose [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: BaseApp [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: WindowedApp [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: ThreadBoundApp [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: PublicInterfaceMixin [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: Switches [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: Profile [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: BackplaneIntegration [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: Lounge [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: Ignition [VM] embed.js (16737):1
DISQUS assertion failed: Unsafe attempt to redefine existing module: HostConfig

最佳答案

将 Disqus 与 Ember 集成

更新 - 现在有一个 Ember Addon here .

我刚刚在 ember 博客框架 ( see source here ) 上集成了异步 Disqus,我是这样做的:

首先,将选项设置为一个对象(所有组件都可以轻松访问):

App.DisqusOptions = Em.Object.create({
shortname: 'example', // Set this to your Disqus account's shortname
});

接下来,使用他们给您的代码加载一次且仅一次。我在组件中这样做了:
App.DisqusCommentsComponent = Em.Component.extend({
setupDisqus: function() {
if (!window.DISQUS) {
var disqusShortname = App.DisqusOptions.get('shortname');
window.disqus_shortname = disqusShortname; // Mimic behaviour as if we're setting variable in a script tag

var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqusShortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
}
}.on('didInsertElement'),
});

您也可以通过设置 disqusLoaded 来做到这一点。运行 setupDisqus() 后,选项对象上的属性为 true方法并进行检查。

此外,您可以使用 script 在您的应用程序模板中执行此操作。标签,但如果您在没有 id 元素的页面上加载脚本,这会导致错误。的 #disqus_thread .

接下来,使用 Em.ViewEm.Component您将放置在您希望评论出现的每个页面上。我们叫它 App.DisqusCommentsComponent .此组件将没有布局(模板)。由于每次我们更改路线/帖子时都会加载此组件,因此这是调用 DISQUS.reset() 的理想场所.
App.DisqusCommentsComponent = Em.Component.extend({
elementId: 'disqus_thread', // ID is used by Disqus to know where to load the comments
timer: null,

setupDisqus: function() {
// setupDisqus() code left out for purposes of not repeating myself
}.on('didInsertElement'),

loadNewPostComments: function() {
if (window.DISQUS) {
this.reset();
} else {
// If DISQUS hasn't finished async loading yet, check again in 100 ms. Once it's loaded, the above this.reset() will be called.
this.set('timer', Em.run.debounce(this, this.loadNewPostComments, 100));
}
},

reset: function() {
var controller = this.get('parentView.controller');
var postIdentifier = controller.get('urlString');
var postUrl = window.location.href;

// Since this view has the elementId Disqus targets, we need to wait until after the view has finished rendering to call the reset function, which searches for #disqus_thread
Em.run.scheduleOnce('afterRender', function() {
window.DISQUS.reset({
reload: true,
config: function () {
this.page.identifier = postIdentifier;
this.page.url = postUrl;
}
});
});
},
});

注意变量 postIdentifier是在 Controller 上为每个博客文章设置的属性,作为 Controller 的模型加载。您将需要一种类似的方法来识别每条路线以跟踪评论。

等等,瞧!每次用户将路由更改为模板中包含注释组件的路由时,都会进行异步调用。例如:
// Some random hbs here for your blog post
{{disqus-comments}}

Disqus JS 配置变量

每当您设置像 these 这样的配置变量时,您需要在窗口上为它们设置一个属性。例如:
var disqusShortname = App.DisqusOptions.get('shortname');
window.disqus_shortname = disqusShortname;

// Do stuff with disqusShortname here

旁注:评论数

如果你想使用 Disqus 的评论计数功能,你可以采用与上述类似的方法。但是,您还需要重新打开 View {{link-to}} helper 调用类似于以下内容:
Em.LinkView.reopen({

addDisqusTag: function() {
var commentCount = this.get('commentCount');

if (commentCount) {
var isLinkToPost = this.get('isLinkToPost');
var href = this.get('href');
var disqusTag = '#disqus_thread';

this.set('href', href + disqusTag);
}
}.on('willInsertElement'),
});

现在,如果您在模板中执行以下操作,它将返回一个 commentCount:
{{#link-to 'post' this.urlString commentCount='true'}}{{/link-to}}

希望有帮助。如果您有任何问题,请告诉我!

关于ember.js - 将 disqus 与 emberjs 集成仅适用于第一页加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17634034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com