javascript - Meteor Tracker 无法自动接收订阅

标签 javascript meteor publish-subscribe meteor-blaze minimongo

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

然后,我可以离开所述模板并最终返回。然而,我注意到回来后,Blaze 没有捕获我的更改。当路由返回时,似乎调用的是onRendered而不是onCreated。这是有道理的,但是,onRendered 还没有对我的所有数据更改做出完全 react 。我注意到这是因为 minimongo 实际上没有 onRendered 的数据。

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

假设我有一些名为“对象”的默认通用集合。

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 中的数据? “重新订阅”是一种不好的做法吗?

最佳答案

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

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

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');
  }
});

关于javascript - Meteor Tracker 无法自动接收订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58457658/

相关文章:

javascript - strophe.js PEP 处理程序未正确附加

publish-subscribe - pub.py 中存在无效语法

django - 创建一个 web url 来监听 redis pubsub 发布的消息

javascript - VideoJS - 字幕/字幕轨道在 Chrome 中显示两次?

javascript - IE11 中的 postMessage 处理

javascript - ASP.NET/IIS 将 302 响应重写为 200

javascript - 即使在较小的设备上, meteor 上的猫头鹰旋转木马也始终会设置 5 个项目

javascript - Heroku Node 部署 "internal server error"

javascript - 将服务器的回调集成到 Meteor/Node 方法中

javascript - meteor 前端如何有条件订阅数据?