我有以下把手模板(片段):
{{#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}}
您可以从中观察两件事:
如果我没有使用遗留数据源,我很乐意解决这两个问题。但是我有多个底层数据源,它们有不同的开发人员和不同的约定(或缺少它们)。模型通过大多数自动化的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上,并且看到了与最近的主人相同的行为。
答案 0 :(得分:1)
有没有办法可以配置/说服Ember / Handlebars按原样使用属性名称,即忽略大写字母 - &gt;全球大会?
这些约定非常深入到框架中,确保没有开/关切换。
如果可能的话,我想避免手工映射大量属性。也欢迎其他可能性/建议。
这正是串行器的用途。当然,手动映射这些属性听起来像是一个很大的提升,但除非你的数据源每天都在变化,否则这是一次性的事情,并且不会比首先定义ember-objects所需的工作多得多。另一个好处是,您可以将此映射封装在一个位置,释放您的ember modesl / controllers / views / templates以使用一致的命名约定。我会认真地建议投资这种方法。例如:
serializer.map(Cbe, {
xyzdata: { key: 'XYZdata' }
});
有了这些,ember将负责所有属性的双向映射。有关如何完成此操作的更多示例,请查看json serializer tests。