【问题标题】:Handlebars dynamic field names车把动态字段名称
【发布时间】:2013-11-14 23:56:09
【问题描述】:

我正在使用 Meteor 应用程序中的 Handlebars 并希望执行以下操作:

我有一个包含定期付款数据的数据库。这是我用于显示下一个付款详细信息的标记:

{{#each Customers}}
    <tr>
        <td id="{{nextpayment}}">{{nextpayment}}</td>
        <td>{{name}}</td>
        <td>{{subscription_amount}}</td>
        <td><input type="checkbox" class="payment-received" data-id="{{_id}}"></td>
    </tr>
{{/each}}

这将生成以下示例:

<tr>
    <td id="3-11-2013">3-11-2013</td>
    <td>John Smith</td>
    <td>$55</td>
    <td><input type="checkbox" class="payment-received" data-id="yZxkFPgeCzpBK6LKJ"></td>
</tr>

我希望能够通过复选框跟踪是否已收到付款。我通过创建一个字段名称为相应日期和一个简单布尔值的数据库条目来实现这一点。 (例如 2013 年 3 月 11 日:假)。所以我需要能够为与当前nextpayment 值对应的字段名称 插入

例如,在这种情况下,我想获取3-11-2013 的数据库条目并插入真/假(或其他)的值,以便我可以使用它。

我的问题是:有什么方法可以将其用于车把模板?

【问题讨论】:

    标签: javascript jquery meteor templating handlebars.js


    【解决方案1】:

    如果复选框是供用户检查的,那么您可能有另一个名为check_payment 的字段,可按如下方式使用:

    <input type="checkbox" name="check_payment" class="payment-received" data-id="{{_id}}" checked="
    {{#if author}}    
      checked
    {{/if}}
    ">
    

    另一种方法:

    由于我不了解您的应用程序的完整数据结构或平台,因此我将做出一些假设并因此编写伪代码。

    核心点是在什么时候将一条记录插入到数据库中,对应一个客户和一个日期。客户付款后,客户或应用程序将自行勾选复选框(true 值),否则默认值为 false。

    1) 服务器端操作

    Handlebars.registerHelper('check_present', function(obj,list, options) {
        for(var i=0,j=list.length; i<j; i++) {
            if(obj==list[i])return true;
        }
        return false;
    });
    
    
    {{#each Customers}}
        <tr>
            <td id="{{nextpayment}}">{{nextpayment}}</td>
            <td>{{name}}</td>
            <td>{{subscription_amount}}</td>
    
    
            <td>
                <input type="checkbox" class="payment-received" data-id="{{_id}}" 
    
                {{if check_present(_id,customer_list) }}  //User-defined Handlebar function
                    checked="checked"
                {{/if}}></td>
        </tr>
    {{/each}}
    

    2) 客户端操作:使用JS库实现Underscore.js、Prototype.js、Backbone.js等实用功能

    使用 underscore.js 和 jQuery,

    $('.payment_received').each(function(){
        if(_.contains(customer_list, $(this).attr('data-id'))){
            $(this).attr("checked","checked");
        }else{
            $(this).removeAttr("checked");
        }
    })
    

    3) 数据库级操作:在数据库级执行操作,获取谁已付款和谁未付款以及完整的客户列表。然后在它们之间做交叉操作。您现在可以直接使用车把了。

    【讨论】:

    • 问题是,ID 对应于单个客户,但每个客户都有与其关联的多笔付款,我要跟踪其状态(每月一次)。所以我需要找到一种方法来识别和跟踪每一笔付款。我目前的解决方案是使用付款的具体日期作为字段名称,但这显然导致了我当前的问题。
    • 还有一种做法,如果有记录对应一个日期,则勾选复选框,否则,保持复选框为空。听起来怎么样?
    • 这样,您只需要'customer1':'2013-11-04' 而不是'customer1':'2013-11-04':false
    • @Calvin 请检查以“另一种方法”开头的更新答案。
    • 我接受了你的想法,但稍作改动。最有帮助的是将我指向.registerHelper(我真的需要更好地阅读文档)。这是我所做的:Handlebars.registerHelper('check', function(id) { var fieldname = Customers.find({_id: id, stage : "Subscribed (7 of 7)"}).fetch()[0]["nextpayment"]; var bool = Customers.find({_id: id, stage : "Subscribed (7 of 7)"}).fetch()[0][fieldname]; console.log(bool); if (bool === true) { return "checked"; } else{ return ""; }; });
    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多