【发布时间】: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