绕过/禁用大写 - > Handlebars模板中的全局推断?

时间:2013-02-05 07:28:31

标签: ember.js handlebars.js

我有以下把手模板(片段):

{{#each cbe in abs.XyzBookingEntries}}
    <tr>
        {{#if cbe.isLoaded}}
            <td>{{cbe.XYZdata.ApptDuration}} min:</td> 
            <td>
                {{cbe.XYZdata.ApptType}}
                {{#if cbe.XYZdata.ApptTypeDetailCode}}
                    ({{cbe.XYZdata.ApptTypeDetailCode}})
                {{/if}}
            </td>
            <td {{bindAttr class="cbe.XYZdata.statusClass"}}><strong>{{cbe.XYZdata.ApptStatus}}</strong></td>
        {{else}}
            <td>
                Loading...
            </td>
        {{/if}}
    </tr>
{{/each}}

您可以从中观察两件事:

  1. 我的模型上有大写属性
  2. 我在这些属性中的大小写不一致(XyzBookingEntries与XYZdata)
  3. 如果我没有使用遗留数据源,我很乐意解决这两个问题。但是我有多个底层数据源,它们有不同的开发人员和不同的约定(或缺少它们)。模型通过大多数自动化的ORM和序列化从我的数据库进入客户端。并且由于约定不一致,自动名称映射(例如,使用keyForAttributeName)将是困难的,尤其是双向的(XYZdata - &gt; xyzdata - &gt; Xyzdata?)。但是,如果只是一个不公平的问题,我可以用文档修复它。

    更大的问题是我的把手模板barfs具有这些名称 - 我认为因为它想要将它们解释为全局而不是成员属性。当以下模板呈现时,我收到以下警告消息:

    WARNING: Watching an undefined global, Ember expects watched globals to be setup 
    by the time the run loop is flushed, check for typos
    

    虽然我确实按预期呈现了所有数据!当它从DOM中删除时,我会收到这样的错误:

    node is undefined
        node.unchain(key, path);
    

    如果我在警告和错误出现时监视调用堆栈中的变量,则可以找到我在模板中呈现的键(例如,在pendingQueue中)。

    Handlebars认为它们是全局变量的理论得到以下事实的支持:如果我定义以下属性:

    xyzData: function(){
        return this.get('XYZdata');
    }.property('XYZdata')
    

    并将我的所有链更改为引用cbe.xyzData.*而不是警告和错误消失!

    所以,我的问题是:

    有没有办法可以配置/说服Ember / Handlebars按原样使用属性名称,即忽略大写字母 - &gt;全球大会?如果可能的话,我想避免手工映射大量属性。也欢迎其他可能性/建议。

    我应该提到我在1.0.0-pre4上,并且看到了与最近的主人相同的行为。

1 个答案:

答案 0 :(得分:1)

  

有没有办法可以配置/说服Ember / Handlebars按原样使用属性名称,即忽略大写字母 - &gt;全球大会?

这些约定非常深入到框架中,确保没有开/关切换。

  

如果可能的话,我想避免手工映射大量属性。也欢迎其他可能性/建议。

这正是串行器的用途。当然,手动映射这些属性听起来像是一个很大的提升,但除非你的数据源每天都在变化,否则这是一次性的事情,并且不会比首先定义ember-objects所需的工作多得多。另一个好处是,您可以将此映射封装在一个位置,释放您的ember modesl / controllers / views / templates以使用一致的命名约定。我会认真地建议投资这种方法。例如:

serializer.map(Cbe, {
  xyzdata: { key: 'XYZdata' }
});

有了这些,ember将负责所有属性的双向映射。有关如何完成此操作的更多示例,请查看json serializer tests