1

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

{{#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)

如果我不使用旧数据源,我会很高兴解决这两个问题。但是我有多个底层数据源,具有不同的开发人员和不同的约定(或缺乏约定)。模型通过大部分自动化的 ORM 和序列化从我的数据库获取到客户端。而且由于约定不一致,因此自动名称映射(例如 with keyForAttributeName)会很困难,尤其是双向(XYZdata -> xyzdata -> Xyzdata?)。但是,如果这只是一个糟糕的约定问题,我可以用文档来解决它。

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

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 按原样使用属性名称,即忽略大写 -> 全局约定?如果可能,我想避免手动映射大量属性。也欢迎其他可能性/建议。

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

4

1 回答 1

1

有没有办法可以配置/说服 Ember/Handlebars 按原样使用属性名称,即忽略大写 -> 全局约定?

这些约定深深地融入了框架,确保没有开/关开关。

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

这正是序列化程序的用途。当然,手工绘制这些属性听起来像是一个很大的提升,但除非您的数据源每天都在变化,否则这是一次性的事情,并且不会比首先定义 ember-objects 付出更多的努力。另一个好处是您可以将此映射封装在一个地方,从而释放您的 ember 模型/控制器/视图/模板以使用一致的命名约定。我会认真建议投资这种方法。例如:

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

有了这些,ember 将负责所有属性的双向映射。查看json 序列化程序测试以获取更多关于如何完成此操作的示例。

于 2013-02-05T13:40:58.357 回答