帮助!我的应用程序中发生了一些非常奇怪的事情。
我有一个merchantReview
模板,可以显示评论者的数量
以下是模板的样子:
<template name="merchantReview">
<div> {{numberOfReviewers}} Total</div>
帮助程序代码是什么样的:
Template.merchantReview.helpers({
'numberOfReviewers': function () {
var numberOfReviewers = 0;
var merchantProfileId = Session.get('offerUserId2');
console.log("The numberOfReviews _id session is: " + merchantProfileId );
merchantReviews.find({_id: merchantProfileId}).map(function (doc)
{
numberOfReviewers += doc.noOfReviewers;
});
return numberOfReviewers;
}
});
这根本不会在merchantReview
页面上产生任何内容。
让我们看看路由器:
Router.route('/merchantReview/:_id', {
template: 'merchantReview',
data: function(){
},
waitOn: function(){
return Meteor.subscribe('merchantReviews');
}
});
订阅的是什么:
Meteor.publish('merchantReviews', function publishmerchantReviews(){
return merchantReviews.find();
});
现在为&#34; 非常奇怪的东西&#34;部分。 当我在chrome浏览器控制台中运行以下代码(类似于帮助程序代码)时,我得到了混合结果。
当我运行以下内容时:
var numberOfReviewers = 0;
var merchantProfileId = Session.get('offerUserId2');
console.log("The _id is: " + merchantProfileId );
merchantReviews.find({_id: merchantProfileId}).map(function (doc)
{
numberOfReviewers += doc.noOfReviewers;
});
console.log (numberOfReviewers);
......它产生了:
The _id is: udEnfEmy5DSBvDsSy
0
如您所见,它会绕过merchantReviews.find
查询。
然而,当稍微更改代码时,运行:
var numberOfReviewers = 0;
var merchantProfileId = Session.get('offerUserId2');
console.log("The _id is: " + merchantProfileId );
merchantReviews.find({_id: "udEnfEmy5DSBvDsSy"}).map(function (doc)
{
numberOfReviewers += doc.noOfReviewers;
});
console.log (numberOfReviewers);
这次它产生:
The _id is: udEnfEmy5DSBvDsSy
93
奇怪的不是吗?
有人可以解释为什么
merchantReviews.find({_id: merchantProfileId})...
查询无法识别保存merchantProfileId
值的udEnfEmy5DSBvDsSy
变量吗?我该如何解决这个问题?
答案 0 :(得分:0)
只需使用光标上的.count(),即可简化和加速助手工作。如果您在评论中提到,您的offerUserId2
会话变量返回一个数组,那么您只需使用[0]
引用其第一个元素:
Template.merchantReview.helpers({
numberOfReviewers() {
return merchantReviews.find(Session.get('offerUserId2')[0]).count();
}
})
答案 1 :(得分:0)
在查询中未识别变量的原因是因为变量是数组形式而不是字符串形式。
我通过console.log("The _id is: " + merchantProfileId );
这有时会产生:
["udEnfEmy5DSBvDsSy"]
我通过清理变量来解决他的问题,以确保其字符串不是使用toString()
函数的数组。所以在代码中:merchantProfileId.toString();
以下是代码中的完整分辨率:
var numberOfReviewers = 0;
var merchantProfileId = Session.get('offerUserId2');
// Below immediately sanitize the variable ensuring it is a string
// before its used in the query.
merchantProfileId = merchantProfileId.toString();
console.log("The _id is: " + merchantProfileId );
merchantReviews.find({_id: merchantProfileId}).map(function (doc)
{
numberOfReviewers += doc.noOfReviewers;
});
console.log (numberOfReviewers);
这会产生:
The _id is: udEnfEmy5DSBvDsSy
104
答案 2 :(得分:-2)
你的问题是一个经典的javascript async gotcha。看看你的代码,
merchantReviews.find({_id: "udEnfEmy5DSBvDsSy"}).map(function (doc)
{
numberOfReviewers += doc.noOfReviewers;
});
console.log (numberOfReviewers);
对numberOfReviewers的添加发生在merchantReviews.find()的回调中 - 通常会在稍后的某个时间发生。您的console.log可能在此之前发生,这解释了为什么您得到了奇怪的结果。如果您将代码更改为此,您将获得一致的结果。
merchantReviews.find({_id: "udEnfEmy5DSBvDsSy"}).map(function (doc)
{
numberOfReviewers += doc.noOfReviewers;
console.log (numberOfReviewers);
});
以这种方式思考,在javascript时间向右移动,而不是向下移动页面。因此,作为回调一部分的缩进代码(并向右缩进)发生在底部的代码之后。