次のハンドルバー テンプレート (フラグメント) があります。
{{#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}}
そこから、次の 2 つのことがわかります。
- モデルの属性を大文字にしました
- これらの属性の大文字化に一貫性がありません (XyzBookingEntries と XYZdata)
レガシ データ ソースを使用していなければ、喜んでこれらの両方を修正します。しかし、さまざまな開発者とさまざまな規則 (またはその欠如) を持つ複数の基になるデータ ソースがあります。モデルは、ほとんど自動化された ORM とシリアライゼーションを介して、データベースからクライアントに取得されます。また、規則が一貫していないため、自動化された名前マッピング (たとえば、 を使用keyForAttributeName
) は、特に双方向 (XYZdata -> xyzdata -> 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
たとえば、.
ハンドルバーがグローバルであると考えるという理論は、次のプロパティを定義すると、次の事実によってサポートされます。
xyzData: function(){
return this.get('XYZdata');
}.property('XYZdata')
代わりにすべてのチェーンを参照に変更するcbe.xyzData.*
と、警告とエラーがなくなります!
だから、私の質問は:
Ember/Handlebars が属性名をそのまま使用するように構成/納得させる方法はありますか? 可能であれば、多数の属性を手動でマッピングすることは避けたいと思います。他の可能性/提案も受け入れます。
私は 1.0.0-pre4 を使用していますが、最近のマスターでも同じ動作が見られます。