在 template.foo.rendered 中获取 this._id 个集合实例
Get this._id of collection instance in template.foo.rendered
我尝试在文章下包含 Semantic UI (http://semantic-ui.com/modules/rating.html) 的评级模块,以便用户能够对其进行评级。如果用户对文章进行评分,文章 ID 将存储到 Meteor.user().profile.ratedItems 中。
如果用户离开文章转到另一篇文章然后返回到第一篇文章,则评级模块应呈现为只读(因此用户无法再次对同一篇文章进行评级)。
问题是我不知道如何检查文章_id 是否存储在 Meteor.user() 中。profile.ratedItems 在 template.foo.rendered 中,因为 this._id 没有给出文章id 但模板的 id。
在 template.foo.events 和 template.foo.helpers 中,我可以通过 _.contains(Meteor.user().profile.ratedItems,this._id 这句话来检查) 并且它在任何地方都可以正常工作,但在 template.foo.rendered 中是有原因的。现在,即使用户对一篇文章进行多次评分,数据库中的评分也不会改变。但我需要解决 "visual" 问题。
代码如下:
JS:
Template.foo.helpers({
rate: function () {
return Math.floor(this.rating);
},
state : function () {
if (Meteor.userId()) {
if (_.contains(Meteor.user().profile.ratedItems,this._id)) {
return "rated"
} else {return "unrated"}
} else {
return ""
}
},
statetext: function () {
if (Meteor.userId()) {
if (_.contains(Meteor.user().profile.ratedItems,this._id)) {
return "Overall rating:" }
else { return "Rate the article:"}
} else {
return "Overall rating:"
}
}
});
Template.foo.rendered = function() {
if (Meteor.userId()) {
if (_.contains(Meteor.user().profile.ratedItems,this._id)) {
$('.ui.rating').rating('disable');
} else {
$('.ui.rating').rating();
}
} else {
$('.ui.rating').rating('disable');
}
};
Template.foo.events({
'click .unrated': function () {
var addedRating = $('.unrated').rating('get rating');
var currentArticleId = this._id;
var newsum = this.rating_sum+addedRating;
var newcount = this.rating_count+1;
var newrating = newsum/newcount;
Schools.update(currentSchoolId,{$inc: {rating_count:1}});
Schools.update(currentSchoolId,{$inc: {rating_sum:addedRating}});
Schools.update(currentSchoolId,{$set: {rating:newrating}});
Meteor.users.update({_id:Meteor.userId()},{$push: {'profile.ratedItems':currentArticleId}});
$('.ui.rating').rating({"set rating":Math.floor(newrating)});
$('.ui.rating').rating('disable');
}
});
HTML:
<template name="schoolPage">
<div class="ui center aligned blue segment">
{{#if currentUser}}{{statetext}}{{else}}Overall rating:{{/if}}
<div class="ui tiny heart rating {{state}}" data-rating="{{rate}}" data-max-rating="5"></div>
</div>
</template>
我考虑过使用 Session.set 和 Session.get 但还没有找到任何解决方案。
预先感谢您的帮助。
您可以在 rendered
回调中使用 Template.currentData
而不是 this
。
请参阅 http://docs.meteor.com/#/full/template_currentdata 中的文档。
我尝试在文章下包含 Semantic UI (http://semantic-ui.com/modules/rating.html) 的评级模块,以便用户能够对其进行评级。如果用户对文章进行评分,文章 ID 将存储到 Meteor.user().profile.ratedItems 中。
如果用户离开文章转到另一篇文章然后返回到第一篇文章,则评级模块应呈现为只读(因此用户无法再次对同一篇文章进行评级)。
问题是我不知道如何检查文章_id 是否存储在 Meteor.user() 中。profile.ratedItems 在 template.foo.rendered 中,因为 this._id 没有给出文章id 但模板的 id。
在 template.foo.events 和 template.foo.helpers 中,我可以通过 _.contains(Meteor.user().profile.ratedItems,this._id 这句话来检查) 并且它在任何地方都可以正常工作,但在 template.foo.rendered 中是有原因的。现在,即使用户对一篇文章进行多次评分,数据库中的评分也不会改变。但我需要解决 "visual" 问题。
代码如下:
JS:
Template.foo.helpers({
rate: function () {
return Math.floor(this.rating);
},
state : function () {
if (Meteor.userId()) {
if (_.contains(Meteor.user().profile.ratedItems,this._id)) {
return "rated"
} else {return "unrated"}
} else {
return ""
}
},
statetext: function () {
if (Meteor.userId()) {
if (_.contains(Meteor.user().profile.ratedItems,this._id)) {
return "Overall rating:" }
else { return "Rate the article:"}
} else {
return "Overall rating:"
}
}
});
Template.foo.rendered = function() {
if (Meteor.userId()) {
if (_.contains(Meteor.user().profile.ratedItems,this._id)) {
$('.ui.rating').rating('disable');
} else {
$('.ui.rating').rating();
}
} else {
$('.ui.rating').rating('disable');
}
};
Template.foo.events({
'click .unrated': function () {
var addedRating = $('.unrated').rating('get rating');
var currentArticleId = this._id;
var newsum = this.rating_sum+addedRating;
var newcount = this.rating_count+1;
var newrating = newsum/newcount;
Schools.update(currentSchoolId,{$inc: {rating_count:1}});
Schools.update(currentSchoolId,{$inc: {rating_sum:addedRating}});
Schools.update(currentSchoolId,{$set: {rating:newrating}});
Meteor.users.update({_id:Meteor.userId()},{$push: {'profile.ratedItems':currentArticleId}});
$('.ui.rating').rating({"set rating":Math.floor(newrating)});
$('.ui.rating').rating('disable');
}
});
HTML:
<template name="schoolPage">
<div class="ui center aligned blue segment">
{{#if currentUser}}{{statetext}}{{else}}Overall rating:{{/if}}
<div class="ui tiny heart rating {{state}}" data-rating="{{rate}}" data-max-rating="5"></div>
</div>
</template>
我考虑过使用 Session.set 和 Session.get 但还没有找到任何解决方案。 预先感谢您的帮助。
您可以在 rendered
回调中使用 Template.currentData
而不是 this
。
请参阅 http://docs.meteor.com/#/full/template_currentdata 中的文档。