我有一个视图显示用户发布的一些图片和一些数据(让我们的图像Instagram)。
我已将这些图片作为非反应数据(否则您可以看到许多更新),但这些图片只有一个按钮可以显示图片。如果我将此作为非反应性数据,当我点击“喜欢”时,我无法看到充满的心(我需要刷新)。
这是我的订阅功能:
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;
});
}
是否可以使用非反应性模型,但在其上具有一些反应性属性?
我正在使用Angular 1.X和TS btw
提前致谢!
PS:当我将反应变为真时,这是不正常的吗?
答案 0 :(得分:2)
修改代码:
//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.默认情况下,反应标志为真,您无需进行设置。 2.函数find只接受两个参数,而不是3。
应该是:
const food = Food.find({}, {reactive: true, sort: this.sort})
如果您需要某些数据子集,则只能进行反应(来自某些集合)。您可以创建一个特定的方法(仅限udpates"喜欢")。 https://guide.meteor.com/methods.html
<强>更新强> 以下是使用return参数编写方法的方法(查看两个示例,使用Future和不使用): How to invoke a function in Meteor.methods and return the value
<强> UPDATE2:强>
注意:但要小心,如果你以某种方式设法得到&#34;空&#34;光标在find()中,你的Tracker.autorun将停止反应。只有在需要监视的情况下,自动运行才有效。
方法的要点是,如果你想有一次非反应动作的东西。您在服务器上定义方法:
Meteor.methods({
myMethod: ()=> {
return "hello";
}
});
您可以通过以下方式从客户端拨打电话:
Meteor.call('myMethod', (error, result) => {
console.log(result); // "hello"
});
而不是使用纯粹的集合。您可以开始使用发布/订阅。在服务器上,您发布&#39;喜欢&#39;在客户端,您只需听取这个新的反应视图。如,
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.subscibe('likes', {food.owner, food.likes}).subscribe(()=>{});
答案 1 :(得分:1)
这只是我的头脑。
您是否尝试过查看Tracker
? https://docs.meteor.com/api/tracker.html
但更具体地说,方法Tracker.nonreactive
https://docs.meteor.com/api/tracker.html#Tracker-nonreactive