我是Meteor的新手,并建立一个演示网站来玩它,但注意到一个有趣的问题。在下面的代码中,我正在尝试创建一个选择框,并为用户的出生日期填充多年。对此的帮助似乎是直截了当的。问题是将Mongo的查询绑定到它,以便我可以显示所选的选择。我最终创造的是可怕的。多次调用db然后isSelected助手再次运行并且不必要地旋转所有内容。
显然,必须有一种方法来创建选择,同时在一次通过中找到所选选项,最好不需要额外的数据库调用。但是助手只返回一个值。也许用年份和选择状态返回数组?我不认为我已经看过任何我读过的东西了,但是现在还有Meteor的早期,我什么都不知道。任何人都有关于如何以卓越的性能创建它的想法?感谢
<template name="accountProfile">
{{#with accountDetails}}
Other bits of data using accountDetails here
<li>
{{> userDateOfBirth}}
</li>
{{/with}}
</template>
<template name="userDateOfBirth">
<select name="userDateOfBirthYear">
{{#each displayYears}}
<option value="{{this}}" selected="{{isSelected}}">{{this}}</option>
{{/each}}
</select>
</template>
Template.accountProfile.helpers({
'accountDetails': function(){
var currentUser = Meteor.userId();
var userProfileCreated = User.findOne({ createdBy: currentUser });
return userProfileCreated;
}
});
Template.userDateOfBirth.helpers({
'displayYears': function(){
var listOfYears = [];
var numberOfYearsToList = 120;
for (var i = numberOfYearsToList-1; i >= 0; i--) {
listOfYears[i] = 2015 - i;
};
return listOfYears;
},
'isSelected' : function(){
var currentUser = Meteor.userId();
var userProfileCreated = User.findOne({ createdBy: currentUser });
var numberOfYearsToList = 120;
for (var i = numberOfYearsToList-1; i >= 0; i--) {
console.log(2015 - i + " " + this);
if((this) == moment(new Date(userProfileCreated.dateOfBirth)).format("YYYY")){
return "selected";
}
};
}
});
答案 0 :(得分:0)
由于accountDetails
已经返回当前用户的个人资料,因此您可以使用dateOfBirth
(访问父数据上下文)访问其displayYears
内部../
上下文,这有助于您要避免对数据库进行多次查询。
<template name="accountProfile">
{{#with accountDetails}}
//- Other bits of data using accountDetails here
<li>
{{> userDateOfBirth}}
</li>
{{/with}}
</template>
<template name="userDateOfBirth">
<select name="userDateOfBirthYear">
{{#each displayYears}}
<option value="{{this}}" selected="{{isSelected ../dateOfBirth}}">{{this}}</option>
{{/each}}
</select>
</template>
Template.userDateOfBirth.helpers({
'isSelected' : function(dateOfBirth) {
if (this == moment(new Date(dateOfBirth)).format("YYYY")) {
return "selected";
}
}
});