【问题标题】:How to display the good subscription ? Meteor JS如何显示好的订阅?流星JS
【发布时间】:2014-04-27 12:02:15
【问题描述】:

我遇到了一点订阅问题,必须时却不停止。

上下文:

我有一个推文集合,我通过发布/订阅流程向我的客户展示。 这是我的出版物:

Meteor.publish('tweets', function(params) {
    return Tweets.find({hashtag: params});
});

你可以看到我有一个标签来对它们进行排序,并且只显示带有指定标签的推文。 这是我订阅的客户端代码:

var sub;
Template.hashtagPage.rendered = function() {
    // Get the hashtag of the current page
    hashtag = document.getElementById('hashtag').innerHTML; 
    sub = Meteor.subscribe('tweets', hashtag);
};

Template.hashtagPage.destroyed = function(){
    sub.stop();
};

在我的模板中,我会显示订阅时收到的每条推文。我为每个显示推文的页面获得相同的模板。

但这是我的问题。当我第一次进入显示带有标签 #first 的推文的页面时,我可以毫无问题地得到它们。但是,如果接下来我转到显示带有标签 #second 的推文的页面,我的客户会显示带有标签 #first#second 的推文强>。

我在想什么

通常,订阅上的 .stop() 应该从客户端缓存 (docs.meteor.com/#meteor_subscribe) 中删除订阅数据。但我没有。我试图改变 sub.stop() 的位置。当它与订阅在同一个模板函数上时,它可以工作,但是,不会显示任何推文。

如何停止订阅,只在我的客户页面中显示带有好标签的商品推文?

提前致谢

【问题讨论】:

    标签: meteor


    【解决方案1】:

    执行此操作的更标准方法是将您的订阅参数设置为 Session 变量并使用 Deps.autorun() 启动和停止相应的订阅。

    在你的渲染函数中:

    Session.set( "hashTag", hashTag);
    

    在顶级客户端代码中:

    Deps.autorun( function(){
       Meteor.subscribe( 'tweets', Session.get("hashTag") );
    });
    

    当 Session 变量更新时,自动运行函数将在旧订阅句柄上调用 stop。 docs for subscribe中提到了这一点。

    如果您确实想自己管理启动和停止订阅,请确保每个订阅句柄都存储在其自己的变量中,例如 subHandles[ hashTag ],否则您可能会在调用 stop 之前覆盖您需要的句柄。

    【讨论】:

    • 顶级客户端代码是什么意思?渲染函数?或者只是用 client/main.js 编写的代码?
    【解决方案2】:

    使用会话变量。设置完成后,您不必重新运行订阅。从 Meteor 到救援的反应变量。

    Template.hashtagPage.rendered = function() { // Get the hashtag of the current page Meteor.subscribe('tweets', Session.get('hashtag')); };

    Template.hashtagPage.events { 'blur #hashtag': function(event) { Session.set('hashtag', event.target.val()); } };

    通常我会将订阅放在带有 waitOn 的路由中(使用 Iron-router)

    【讨论】:

    • 我不理解你的 template.hashtagPage.event,尤其是“模糊 #hashtag”和 event.target.val()
    • 因为您是从 HTML 元素中获取主题标签,所以我猜测 #hashtag 是一个输入元素。即使没有,您也可以向页面添加一个输入,允许用户更改主题标签(然后重新运行订阅)。
    • 上述方法是否有效并删除了与旧主题标签相关的推文?我的理解是,每次呈现“hashtagPage”时,这都会保留旧数据并在服务器上使用新订阅创建泄漏。您至少应该在每次订阅之前添加句柄并调用 stop。如果订阅有任何重叠数据,这样做仍然会效率低下。
    • 制作了一个gist here 并添加了事实包以显示泄漏。在渲染内部调用 stop 可以防止泄漏,但也可以防止数据进入客户端,因为渲染往往会触发不止一次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2012-10-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    相关资源
    最近更新 更多