流星创建选择然后找到选中的状态

时间:2015-08-28 22:40:22

标签: meteor selected

我是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";
            }
        };
    }
});

1 个答案:

答案 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";
    }
  }
});