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}}

そこから、次の 2 つのことがわかります。

  1. モデルの属性を大文字にしました
  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 を使用していますが、最近のマスターでも同じ動作が見られます。

4

1 に答える 1

1

Ember/Handlebars が属性名をそのまま使用するように構成/納得させる方法はありますか?

これらの規則はフレームワークにかなり深く組み込まれており、オン/オフの切り替えはありません。

可能であれば、多数の属性を手動でマッピングすることは避けたいと思います。他の可能性/提案も受け入れます。

これはまさにシリアライザーの目的です。確かに、これらの属性を手動でマッピングすることは大きなリフトのように聞こえますが、データ ソースが毎日変化する場合を除き、これは 1 回限りのことであり、最初に ember オブジェクトを定義するのにかかる労力よりもはるかに多くの労力は必要ありません。もう 1 つの利点は、このマッピングを 1 か所にカプセル化し、ember モデル/コントローラー/ビュー/テンプレートを解放して、一貫した命名規則で動作させることです。このアプローチに投資することを真剣にお勧めします。例えば:

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

これらを配置すると、ember はすべての属性の双方向マッピングを処理します。これがどのように行われるかの例については、json シリアライザ テストを参照してください。

于 2013-02-05T13:40:58.357 に答える