4

XTemplate のドキュメントでは、{#} を使用して現在の配列インデックスを取得できます。

xlist の itemTpl で使用すると、インデックスの代わりに常に 1 が返されます。

    {
        xtype: 'list',
            store: 'myStore',
            itemTpl:new Ext.XTemplate(
                 '<tpl for=".">',
                      '<div>Item n°{#1}</div>',
                 '</tpl>'
            ),          
    }

ストアに複数のアイテムが含まれている場合でも、常に「アイテム n°1」が生成されます。

私は何か間違っていますか?

4

4 に答える 4

9

配列ではなくExt.data.Storeからデータを取得するExt.Listを使用しているため、XTemplate は一度に 1 つのアイテムしか処理しないことに注意してください。そのため、{#} (xindex とも呼ばれる) は常に 1 を返します。

これを回避するための提案は、次のように、ロードされたストア内のアイテムのインデックスを手動で設定することです: (ストアのリスナー)

listeners: {
  load: function(store, records){
    store.each(function(record, index){
      record.set('index', index);
    },
    store
  );
}

それが役に立てば幸い。

于 2012-04-10T05:12:49.680 に答える
2

私は同じ問題に遭遇し、これを思いつきました:

itemTpl: [
           '<div class="item">' +
              'Number {[this.getIndex()]}' +
           '</div>',
           {
              getIndex: function() {
                  return document.getElementsByClassName('item').length + 1;
              }
           }
         ]

ストアに追加のプロパティを追加するよりも、このソリューションを好みます。

<tpl for="."></tpl>ところで、 itemTplに入れる必要はありません。それは暗黙的です。

于 2013-03-28T00:57:05.497 に答える
0

ここではレコード/配列をループしていないため、これは「設計どおり」です。テンプレートは、ストアの要素ごとに1回インスタンス化されます。

http://www.sencha.com/forum/showthread.php?179728-Autonumber-in-Template-in-DataViewも参照してください。

于 2012-04-09T22:19:19.063 に答える
0

私は同じ問題に遭遇し、このスレッドに遭遇し、より良い解決策があるはずだと考えました. DataView のコードを調べたところ、次のオーバーライド可能なメソッドに気付きました。

prepareData: function(data, index, record) {
    return data;
}

したがって、インデックスがあり、少しオーバーライドを追加するだけで済みます:)。私は、データオブジェクトにインデックスを追加し、オーバーライド目的で提供されているメソッドをオーバーライドする、この簡単な解決策を好みます。

Ext.define('MyApp.overrides.dataview.DataView', {
    override: 'Ext.dataview.DataView',

    prepareData: function(data, index, record) {
        if(Ext.isObject(data)) {
            data.xindex = index + 1;
        }
        return data;
    }
});
于 2013-07-05T09:18:16.020 に答える