Meteor中的非反应性和反应性数据(同一助手)
我有一个视图显示了用户发布的一些图片和一些数据(让我们来看图片Instagram) 我已经有这些图片作为非反应性数据(否则你会看到很多更新),但这些图片有一个按钮喜欢图片。如果这是非反应性数据,当我点击“喜欢”填充的心脏时,我看不到(我需要刷新) 这是我的订阅功能:Meteor中的非反应性和反应性数据(同一助手),meteor,angular-meteor,reactive,Meteor,Angular Meteor,Reactive,我有一个视图显示了用户发布的一些图片和一些数据(让我们来看图片Instagram) 我已经有这些图片作为非反应性数据(否则你会看到很多更新),但这些图片有一个按钮喜欢图片。如果这是非反应性数据,当我点击“喜欢”填充的心脏时,我看不到(我需要刷新) 这是我的订阅功能: this.subscribe('food', () => [{ limit: parseInt(this.getReactively('perPage')), //skip: p
this.subscribe('food', () => [{
limit: parseInt(this.getReactively('perPage')),
//skip: parseInt((this.getReactively('page') - 1) * this.perPage),
sort: this.getReactively('sort')
}, this.getReactively('filters'), this.getReactively('searchText'), this.getReactively('user.following')
]);
这是我的助手:
food() {
const food = Food.find({}, {reactive: true}, {
sort: this.sort
}).fetch().map(food => {
const owner = Meteor.users.findOne(food.owner, {fields: {username: 1, avatarS: 1, following: 1}});
food.avatarS = owner && owner.avatarS;
food.username = owner && owner.username;
if (food.likes.indexOf(Meteor.userId()) == -1) {
// user did not like this plate
food.liked = false;
} else {
// user liked this plate
food.liked = true;
}
return food;
});
}
是否可能有一个非反应性模型,但其上有一些反应性属性
顺便说一句,我用的是角度1.X
提前谢谢
PS:当我将“反应”更改为“真”时,它作为“非反应”工作是正常的吗?这只是我的想法 你试过看追踪者吗 但更具体地说是方法
Tracker.nonreactive
对代码的修改:
//console.log(food.likes);
this.subscribe('reactiveFoodData', {ownerId: food.owner, userId: Meteor.userId()}).subscribe(()=>{
console.log(this.user);
});
// THIS IS THE PUBLISH METHOD LOCATED IN THE SERVER SIDE:
Meteor.publish('reactiveFoodData', function(params: {ownerId:string, userId:string) {
const owner = Meteor.users.findOne(params.ownerId);
if (!owner) {
throw new Meteor.Error('404', 'Owner does not exist');
}
let result = {};
result.avatarS = owner.avatarS;
result.username = owner.username;
const food = Food.find({});
result.liked = !(food.likes.indexOf(params.userId) == -1);
return result;
});
您没有什么问题:
1.被动标志在默认情况下为true,您不需要设置它。
2.函数find只接受两个参数,而不是3个
应该是:
const food = Food.find({}, {reactive: true, sort: this.sort})
如果您需要某些数据,则数据子集只能是被动的(来自某些集合)。您可以创建一个特定的方法(它只表示“喜欢”)。
更新:
下面是如何编写带有返回参数的方法(请检查两个示例,有Future和无):
更新2:
Meteor.methods({
myMethod: ()=> {
return "hello";
}
});
Meteor.call('myMethod', (error, result) => {
console.log(result); // "hello"
});
Meteor.publish('likes', (options: {owner: string, likes: Array<any>}) => {
let result: any = {}
const owner = Meteor.users.findOne(options.owner, username: 1, avatarS: 1, following: 1}});
result.avatarS = options.owner && options.owner.avatarS;
result.username = options.owner && options.owner.username;
result.liked = !(options.likes.indexOf(Meteor.userId()) == -1)
return result;
});
Meteor.publish('likes',(选项:{owner:string,likes:Array})=>{
让结果:any={}
constowner=Meteor.users.findOne(options.owner,用户名:1,头像:1,以下:1});
result.avatarS=options.owner&&options.owner.avatarS;
result.username=options.owner&&options.owner.username;
result.liked=!(options.likes.indexOf(Meteor.userId())=-1)
返回结果;
});
在客户端:
Meteor.subscibe('likes',{food.owner,food.likes})。订阅(()=>{})代码>很有趣。对我来说,这听起来像是一个全新的概念。我看过这个例子:但我担心的是:“这个函数不会关注您自己定义的函数中的任何反应性数据源更新”。如果我想要那个模型的一些属性呢?很抱歉回复太晚了。。。嗯,好问题是,是否可以专门为反应数据创建订阅?是的,与上述其他用户的方法相同。我以后再试试。干杯你有这种实现的例子吗?我使用一个助手返回一个带有我的数据的游标,但是我不知道我必须在哪里定义这个订阅才能使用这个游标的属性,正如我所说的,这是奇怪的部分。默认情况下为true,但如果我将其添加为true值,则数据不是被动的。但我认为正如另一位用户所说,我应该使用Tracker.nonreactive()。关于三个论点,你是对的。也许我什么都看不到,因为我没有整理好,但很好。关于更新的方法,我应该更改第一个模型中的内容。不确定我是否会跟你说这些。@DanielRodriguez如果你说的是angular meteor(如标签所示,那么这意味着你阅读了他们的教程**),你会用angular2还是angular1来搭配meteor?我遵循angular2教程,它提到了方法函数,可以执行一次并返回值。例如,请参见**这是网站上缺少的内容,但仍然可以在github上查看。@DanielRodriguez检查更新。我认为Tracker有点过头了,你想要的是调用服务器方法并从itI获得响应我完成了他们的教程是的,我使用Angular 1.X和TS(信息更新),但自从我完成后,他们改变并添加了很多东西(事实上,这是我的一个报告:)。嗯,我不确定这个方法。下面的用户对此进行了评论,但此方法必须编辑没有反应的先前模型。你的意思是一种方法,只返回初始模型(例如)model1.like(没有反应性)到model2.like?有趣的更新:)的ng重复中的like和更改。有几点要评论:-你说过我在.fetch()之后会失去反应性。如果删除find上的{reactive:true},则带有.fetch()的事件仍然是reactive。这正常吗当你提到如果光标为空,跟踪器将停止反应时,你的意思是,在向光标添加数据后,我必须“重新激活”它,或者在那一刻无法工作(这是可以理解的),我会在回家后尝试。干杯