防止 Meteor 在发布更改时删除已发送给客户端的 MiniMongo 数据
Preventing Meteor from removing MiniMongo data already sent to client when publish changes
我注意到,当我更改已发布的游标时 - 不是游标指向的数据,而是整个游标 - Meteor 将向客户端发送一条 removed
消息,用于所有未出现在新光标。
我的意思是更专业的术语:
// client side
Tracker.autorun(function() {
var someReactiveVar = someReactiveVar.get();
Meteor.subscribe('myPublication', someReactiveVar);
}
...
// server side
Meteor.publish('myPublication', function() {
var someParameter = arguments[0];
return myCollection.find({ someAttribute: someParameter });
});
现在,当 someReactiveVar
发生变化时,所有已发送到客户端 MiniMongo myCollection
的文档都将被删除(如果它们不是新游标的一部分)。在某些情况下,这就是您想要的,但我的问题只是:我可以阻止这种情况吗?怎么样?
当您在 Tracker.autorun
中执行 Meteor.subscribe
时,这里会发生一些神奇的事情。基本上,它会在每次 运行.
之后 .stop()
旧订阅
你有两个选择,
1- 使用 nonreactive
块使多个订阅保持活动状态。
注意:您必须编写一些代码来清理 subHandles
。
var subHandles = [];
Tracker.autorun(function(){
var someReactiveVal = someReactiveVar.get();
Tracker.nonreactive(function(){
var subHandle = Meteor.subscribe('myPublication', someReactiveVal);
subHandles.push(subHandle);
});
});
2- 让您的订阅采用多个值,例如
注意:这将使两组数据在客户端可用,但可能不会阻止重新传输。
Template.myTemplate.events({
'click mybutton': function(){
var newVal = getNewVal();
var arrayOfValues = someReactiveVar.get();
arrayOfValues.push(newVal);
someReactiveVar.set(arrayOfValues);
}
})
// client side
Tracker.autorun(function() {
var arrayOfValues = someReactiveVar.get();
Meteor.subscribe('myPublication', arrayOfValues);
}
...
// server side
Meteor.publish('myPublication', function(arrayOfValues) {
return myCollection.find({
someAttribute: {$in: arrayOfValues}
});
});
我注意到,当我更改已发布的游标时 - 不是游标指向的数据,而是整个游标 - Meteor 将向客户端发送一条 removed
消息,用于所有未出现在新光标。
我的意思是更专业的术语:
// client side
Tracker.autorun(function() {
var someReactiveVar = someReactiveVar.get();
Meteor.subscribe('myPublication', someReactiveVar);
}
...
// server side
Meteor.publish('myPublication', function() {
var someParameter = arguments[0];
return myCollection.find({ someAttribute: someParameter });
});
现在,当 someReactiveVar
发生变化时,所有已发送到客户端 MiniMongo myCollection
的文档都将被删除(如果它们不是新游标的一部分)。在某些情况下,这就是您想要的,但我的问题只是:我可以阻止这种情况吗?怎么样?
当您在 Tracker.autorun
中执行 Meteor.subscribe
时,这里会发生一些神奇的事情。基本上,它会在每次 运行.
.stop()
旧订阅
你有两个选择,
1- 使用 nonreactive
块使多个订阅保持活动状态。
注意:您必须编写一些代码来清理 subHandles
。
var subHandles = [];
Tracker.autorun(function(){
var someReactiveVal = someReactiveVar.get();
Tracker.nonreactive(function(){
var subHandle = Meteor.subscribe('myPublication', someReactiveVal);
subHandles.push(subHandle);
});
});
2- 让您的订阅采用多个值,例如
注意:这将使两组数据在客户端可用,但可能不会阻止重新传输。
Template.myTemplate.events({
'click mybutton': function(){
var newVal = getNewVal();
var arrayOfValues = someReactiveVar.get();
arrayOfValues.push(newVal);
someReactiveVar.set(arrayOfValues);
}
})
// client side
Tracker.autorun(function() {
var arrayOfValues = someReactiveVar.get();
Meteor.subscribe('myPublication', arrayOfValues);
}
...
// server side
Meteor.publish('myPublication', function(arrayOfValues) {
return myCollection.find({
someAttribute: {$in: arrayOfValues}
});
});