3

行がレンダリングされるときに行がすでに選択されているかどうかを定義するためにdgridとそのストアを構成するにはどうすればよいですか?

たとえば、私の行データが次のような場合:

{
  id: 1,
  name: 'Item Name',
  selected: true
}

私の現在のコードは、ストアにデータが入力された後にコレクションをループすることですが、これを行うにはもっと効率的な方法が必要だと確信しています。

var items = [
  {id: 1, name: 'Item 1', selected: true},
  {id: 2, name: 'Item 2', selected: false}
];

require(
  [
    "dgrid/OnDemandGrid",
    "dgrid/Selection",
    "dojo/store/Memory",
    "dojo/_base/declare",
    "dojo/_base/array"
  ],

  function (OnDemandGrid, Selection, Memory, declare, array) {
    var store = new Memory({
        data: items,
        idProperty: "id"
    });

    var grid = new declare([OnDemandGrid, Selection])({
        selectionMode: "multiple",
        columns: {
          id: { label: "ID" },
          name: { label: "Name" }
        },
        store: store
      }, "MyGrid");

      array.forEach(items, function (item) {
        if (item.selected) {
          grid.select(grid.row(item.id));
        }
      });

      grid.startup();
    });
  }
);
4

2 に答える 2

2

私はこの投稿を見つけ、この問題についてコミットしたいと思いました。dgridの最初の行のデータを取得したかったのですが、ここでこの投稿を見つけました。しかし、それは私の解決策に役立ちます。

最初の列に「get」関数を追加し、最初のレコードを見つけて選択することができました。これが、dgridの最初のレコードを取得または選択しようとする人に役立つことを願っています。

var columns = [
  { label: "Name", field: '_item', x: null,
    formatter: lang.hitch(this, this._nameFormatter),
    get: lang.hitch(this, function(item){
        console.log(item)
        if(!this.x) {
          this.x = item.id;
          this.grid.select(item.id);
          this.detailsPane.setDetails(item.id);
          return item;
        } else {
          return item;
        }
      })
    },

   { label: 'Email', field: 'email',
     formatter: lang.hitch(this, this._emailFormatter)
   },

   { label: "Phone", field: "phone" },
   { label: 'Address', field: 'address' },
   { label: 'City', field: 'city' },
   { label: 'State', field: 'state' },
   { label: 'Zip Code', field: 'zipcode'}
];
于 2013-02-19T03:32:41.597 に答える
1

https://github.com/SitePen/dgrid/blob/master/Selection.js#L433Selection.jsと同じように見えますが、選択をレンダリングプロセスの一部にする方法がわかりました。

var grid = new declare([OnDemandGrid, Selection])({
    selectionMode: "multiple",
    store: store,
    columns: {
        id: {
            label: "ID",
            get: function(item) {
                var grid = this.grid;
                if (item.selected === true) {
                    grid.select(grid.row(item.id));
                }
                return item.id;
            }            
        },
        name: { label: "Name" }
    },
    "MyGrid"
);

実際の動作をご覧ください:http://jsfiddle.net/phusick/stxZc/

于 2013-02-07T19:00:17.233 に答える