【问题标题】:Handling and rendering dates that may/not exist处理和呈现可能/不存在的日期
【发布时间】:2016-02-19 20:28:46
【问题描述】:

我有类似这样的架构:

Schema.Adviser = new SimpleSchema({
  "firstName": {
  type: String
  }
});

Schema.Orders = new SimpleSchema({
    "adviserId": {
    type: Object
  },
  "period": {
    type: Date
  },
  "order": {
    type: Number,
    min: 0
  }
});

我需要像这样渲染一个表格:

名字 |一月 |二月

鲍勃| 1 | 0

比尔 | 0 | 1

每个值都是一个可编辑的输入字段。

例如,如果 Bob 在 1 月份没有订单记录,我仍然需要在 1 月份进行渲染,理想情况下使用 0 以便有人可以添加 1 月份的订单。

类似这样的:

months 是要显示的月份数组。每个都遵循以下格式:Mon Feb 01 2016 00:00:00 GMT+0000

{{#each month in months}}
  {{#each getOrders}}
    {{#if equals month period}}{{order}}{{/else}}0{{/if}}
  {{/each}}
{{/each}}

我不仅不能让它工作,而且在花费更多时间尝试调试问题之前,我想知道这是否真的是最好的方法。

有什么建议吗?

非常感谢

【问题讨论】:

    标签: mongodb meteor meteor-blaze


    【解决方案1】:

    var months = ['Jan', 'Feb', 'Mar'];
    var advisors = [{
      ID: 1,
      name: 'Bob'
    }];
    var emptyMonthArray = [0, 0, 0];
    orders = [{
      advisorID: 1,
      period: new Date(),
      order: 3
    }];
    
    function getAdvisors() {
      var returnArray = [];
      advisors.forEach(function(a) {
        var returnObject = {
          name: a.name,
          monthData: emptyMonthArray.slice(0)
        };
        orders.forEach(function(o, i) {
          if (o.advisorID === a.ID) {
            returnObject.monthData[o.period.getMonth()] = o.order;
          }
        });
        returnArray.push(returnObject);
      });
      return returnArray;
    }
    console.log(getAdvisors());

    我认为更简洁的方法是创建一个 getAdvisors 助手,它可以处理和转换数据并返回类似的东西

    [
    {name:'Bill', monthData:[0,1,0,2,...]},
    {name: 'Bob', monthData:[...]}
    ]
    

    这样的模板可以表达得更简洁:

    <tr>
        <th>Name</th>
        {{#each month in months}}
           <th> {{monthname}}</th>
        {{end each}}
    </tr>
    {{#each advisor in getAdvisors }}
    <tr>
        <td>{{name}}</td>
        {{#each monthData in advisor}}
           {{td>{{this}}</td>
        {{end each}}
    </tr>
    {{end each}}
    

    编辑:添加了一个小提琴https://jsfiddle.net/runjep/1xrp1gfq/(这只适用于一年的前 3 个月;-) 之后您必须添加“Apr”,...

    用你的小提琴https://jsfiddle.net/runjep/0qy34pfe/3/再次编辑 不幸的是,meteorpad 宕机了,所以我认为这是可行的。

    {{#each advisers}}
      {{firstName}}
      {{#each monthData}}
        {{this}}
      {{/each}}
    {{/each}}
    

    【讨论】:

    • 您好符文谢谢您的回复。假设“Bob”有 2 月份的订单,但没有 1 月份的订单,我该如何转换数据,因为 2 月份的订单集合中只存在一条记录?我完全同意,如果我可以向模板输出“Jan: 0, Feb: 1”之类的内容,那将是完美的,但因为“Jan”不存在,我陷入了循环地狱试图解决这个问题。再次感谢!
    • 类似这样的东西:jsfiddle.net/runjep/1xrp1gfq 不是很优化。我不知道您的数据模型,但也许应该在出版物中加入数据?
    • Schemas: jsfiddle.net/mishy111/0qy34pfe 我正在使用 publish-composite 来实现连接。看看我的 jsfiddle,您是否希望用您非常友好地发布的内容替换我的“advisers”和“orderGetter”助手?非常感谢
    • 是的——也许只有 orderGetter:jsfiddle.net/runjep/0qy34pfe/1(我更新并重命名了)
    • Hi Rune 我明白了,我现在应该使用 {{#each}} 而不是 monthData 对吧?然后使用 {{order}} 显示它是零还是实际数据?再次感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    相关资源
    最近更新 更多