我有以下车把模板(片段):
{{#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 -> 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中)。
如果我定义了以下属性,那么把手条认为它们是全局的理论是支持的:
xyzData: function(){
return this.get('XYZdata');
}.property('XYZdata')并将我的所有链改为引用cbe.xyzData.*,警告和错误都消失了!
所以,我的问题是::
是否有一种方法可以配置/说服Ember/Handlebars按原样处理属性名,即忽略caps ->全局约定?如果可能的话,我想避免手工映射大量的属性。也可以考虑其他可能性/建议。
我应该提一下,我的成绩是1.0.0-预科4,最近的一位大师也看到了同样的行为。
发布于 2013-02-05 13:40:58
是否有一种方法可以配置/说服Ember/Handlebars按原样处理属性名,即忽略caps ->全局约定?
这些约定非常深入地融入到框架中,当然没有开/关。
如果可能的话,我想避免手工映射大量的属性。也可以考虑其他可能性/建议。
这正是序列化程序的目的。当然,手动映射这些属性听起来是一个很大的提升,但是除非您是数据源,否则这是一次性的事情,并且不会比定义成员对象所花费的精力更多。另一个好处是,您可以将此映射封装在一个地方,从而释放馀下的modesl/控制器/视图/模板来使用一致的命名约定。我会认真地建议投资于这种方法。例如:
serializer.map(Cbe, {
xyzdata: { key: 'XYZdata' }
});随着这些到位,成员将负责所有属性的双向映射。请查看json串行化测试,以获得更多如何完成此操作的示例。
https://stackoverflow.com/questions/14702224
复制相似问题