我有以下车把模板(片段):
{{#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}}
从中可以观察到两件事:
- 我在我的模型上大写了属性
- 我在这些属性中的大小写不一致(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 上,并且看到最近的主人有同样的行为。