救命!我的应用程序中发生了一些非常奇怪的事情。
我有一个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();
});
现在是">非常奇怪的东西"部分。当我在 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})...
查询无法识别保存udEnfEmy5DSBvDsSy
值的merchantProfileId
变量?我该如何解决这个问题?
查询中无法识别变量的原因是变量是数组形式而不是字符串形式。
我通过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
您只需在光标上使用 .count(( 即可简化和加快帮助程序的速度。如果,正如您在注释中提到的,您的 offerUserId2
会话变量返回一个数组,那么您可以使用 [0]
引用它的第一个元素:
Template.merchantReview.helpers({
numberOfReviewers() {
return merchantReviews.find(Session.get('offerUserId2')[0]).count();
}
})
你的问题是经典的javascript异步问题。查看您的代码,
merchantReviews.find({_id: "udEnfEmy5DSBvDsSy"}).map(function (doc)
{
numberOfReviewers += doc.noOfReviewers;
});
console.log (numberOfReviewers);
添加到numberOfRereviews发生在merchantReviews.find((的回调中 - 这通常发生在以后的某个时间。您的控制台.log可能发生在此之前,这解释了为什么您会得到奇怪的结果。如果将代码更改为此代码,将获得一致的结果。
merchantReviews.find({_id: "udEnfEmy5DSBvDsSy"}).map(function (doc)
{
numberOfReviewers += doc.noOfReviewers;
console.log (numberOfReviewers);
});
这样想,在javascript中,时间向右移动,而不是在页面上向下移动。因此,作为回调一部分的缩进代码(并向右缩进(发生在底部的代码之后。