向出版物中的Meteor.users添加计算字段
我正试图在出版物中发布一个自定义计算字段向出版物中的Meteor.users添加计算字段,meteor,Meteor,我正试图在出版物中发布一个自定义计算字段isFriend,该字段从Meteor.user返回一条记录 我尝试了各种解决方案,但没有一种有效: 从发布进行转换无法按此处所述工作 我在这里试过解决办法。。买也不管用。。。请参阅下面的代码 代码: 请告知。转换文档的最简单方法是在您的文档中添加一个transform选项。您可以直接使用meteor API或类似的软件包(有关更多详细信息,请参阅文档) 但是,有时您需要在文档发布之前对其进行转换,因为只有服务器具有必要的信息。签名URL就是一个很好的
isFriend
,该字段从Meteor.user
返回一条记录
我尝试了各种解决方案,但没有一种有效:
- 从发布进行转换无法按此处所述工作
- 我在这里试过解决办法。。买也不管用。。。请参阅下面的代码
请告知。转换文档的最简单方法是在您的文档中添加一个
transform
选项。您可以直接使用meteor API或类似的软件包(有关更多详细信息,请参阅文档)
但是,有时您需要在文档发布之前对其进行转换,因为只有服务器具有必要的信息。签名URL就是一个很好的例子。在这种情况下,您可以使用observeChanges
或observeChanges来操纵每个对象
observeChanges
效率更高,但它只能对部分文档进行操作(例如,如果您想转换已存在的单个字段)。在您的示例中,为了添加字段,您需要查看整个文档,因此您需要一个observe
。尝试以下方法:
Meteor.publish('viewProfile',函数(userId){
检查(用户ID、字符串);
//根据需要修改此选项
变量转换=函数(用户){
user.isFriend=true;
返回用户;
};
//只发布您真正需要的字段
var字段={用户名:1,电子邮件:1,配置文件:1};
var self=这个;
var handle=Meteor.users.find(userId,{fields:fields})。观察({
新增:功能(用户){
self.added('users',user.\u id,transform(user));
},
更改:功能(用户){
self.changed('users',user.\u id,transform(user));
},
删除:函数(用户){
自删除('users',user.\u id);
}
});
这个;
this.onStop(函数(){
handle.stop();
});
});
为了防止对其他人有所帮助,我修改了David Weldon的答案,以返回一个句柄,以便客户端可以测试订阅是否准备就绪。大概是这样的:
在publish.js中:
Meteor.publish('viewProfile', function(userId) {
check(userId, String);
// modify this as needed
var transform = function(user) {
user.isFriend = true;
return user;
};
// only publish the fields you really need
var fields = {username: 1, emails: 1, profile: 1};
var self = this;
var handle = Meteor.users.find({_id: userId}, {fields: fields})
const subsription = handle.observe({
added: function (user) {
self.added('users', user._id, transform(user));
},
changed: function (user) {
self.changed('users', user._id, transform(user));
},
removed: function (user) {
self.removed('users', user._id);
}
});
this.ready();
this.onStop(function() {
subsription.stop();
});
return handle;
});
现在,在客户端中,您可以执行以下操作:
const handle = Meteor.subscribe('viewProfile', userId);
const isLoading = !handle.ready();
非常感谢@DavidWeldon!
const handle = Meteor.subscribe('viewProfile', userId);
const isLoading = !handle.ready();