【问题标题】:Meteor Tracker not receiving subscriptions automaticallyMeteor Tracker 没有自动接收订阅
【发布时间】:2020-02-15 20:27:44
【问题描述】:

我正在使用 Template.onCreated 创建一些模板,然后使用 Tracker.autorun 进行一些订阅,然后从服务器收集数据并将它们存储在客户端的 MiniMongo 上。

然后,我可以离开所说的模板并最终将自己路由回去。但是,我注意到回来后,Blaze 并没有捕捉到我的变化。回路由时,似乎调用了 onRendered 而不是 onCreated。这是有道理的,但是,onRendered 还没有对我所有的数据更改做出反应。我注意到这是因为 minimongo 实际上没有用于 onRendered 的数据。

但是,我注意到它可以通过刷新页面来获取对象(因此调用 onCreated 并再次订阅并从服务器获取一组新数据)我的解决方法是重新订阅 onRendered,但我觉得我不应该这样做,因为我最初已经订阅了 OnCreated。这是 Meteor 的问题吗,DDP 只是变慢了吗?

假设我有一些名为 Objects 的默认通用集合。

const Objects = new Mongo.Collection("Objects"); 

所以在我的 onCreated 中,我订阅了一个集合,如下所示

Template.foo.onCreated(function () {
    var self = this;

    self.autorun(function () {
        const objId= FlowRouter.getParam("id");


            self.objectSubscription = Meteor.subscribe('obj', objId, {
                onReady: function () {

                },
                onStop: function (error) {
                    if (error) {
                        alert('error')
                    }
                }
            });

然后在 onRendered 中我必须破解它并不必要地重新订阅,因为我没有 objId,即我不能只使用 Objects.find(),

Template.foo.onRendered(function () {
    const objId= FlowRouter.getParam("id");

    Meteor.subscribe('obj', objId, {
        onReady: function () {
            $('#obj').addClass('highlight');
        },
        onStop: function (error) {
            if (error) {
                alert('error');
            }
        }
    });

    //I feel like I should just be able to do 
    //const obj = Objects.findOne({_id:objId})
    //$('#obj').addClass('highlight')

});

任何见解,为什么我会在 minimongo 中丢失数据? “重新订阅”是不好的做法吗?

【问题讨论】:

  • 您需要显示更多代码。据我所知,您想使用助手来完成您想要完成的工作。也许在向 stackoverflow 发送垃圾邮件之前先做一下流星教程。
  • 已添加更多信息
  • 请同时显示 html。你有一个名为“tracker”的模板吗?如果没有,那么你真的需要去做流星教程。
  • 一旦您订阅了一个集合,集合上的所有更改都应该在客户端反映为它的反应。您的自动运行函数不会一次又一次地调用自身,因为块内没有变量被更改/更新。因此 onCreated 中的跟踪器只会被调用一次。您也可以尝试在路由器中订阅该集合。
  • @user3807691 嗯..我的误解是实际订阅本身是反应性的,因此应该触发自动运行被调用。我认为这是因为订阅订阅了一个集合 - 并且集合(或至少是游标)是反应性的。我已经看到订阅路由的解决方法,但您认为这可能效率低下或多余。您是否建议将光标存储到自动运行函数中的反应/会话变量中?

标签: javascript meteor publish-subscribe meteor-blaze minimongo


【解决方案1】:

onCreatedonRendered 不是响应式的,但 template helpers 是。因此,要不断检测这两者的变化,您必须创建一个反应式上下文并将其放置在其中,这可以使用Tracker.autorun 来实现。另外,请注意,最好保留 onRenderd 用于 DOM 操作和 onCreated 用于订阅和创建 reactive variables

您不需要双重订阅来检测更改,而 IMO 这通常是一种不好的做法。

Template.foo.onCreated(function onCreated() {
  const self = this;
  this.autorun(function() {
  const id = FlowRouter.getParam('_id');
  self.subscribe('obj', id);
  });
});


Template.foo.onRendered(function onRendered() {
  const self = this;
  // this will run after subscribe completes sending records to client
  if (self.subscriptionsReady()) {
    // do whatever you want
    $('#obj').addClass('highlight');
  }
});

【讨论】:

    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 2015-07-07
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    相关资源
    最近更新 更多