Столбец поиска DevExtreme AngularJs DataGrid с источником данных в одном объекте

У меня есть данные следующим образом:

var customers = [
    {
     "ID": 1,
     "Name":"John Mayor"
     "Company": [{"ID": 1, "Name":"Super Mart"},{"ID": 2, "Name":"Big Mart"}]
     "CompanyID":1
    }, {
     "ID": 2,
     "Name": "Rick Bard",    
     "Company": [{"ID": 1, "Name":"Oracle"},{"ID": 2, "Name":"Google"}]
     "CompanyID":2
    }
];

Я хотел бы представить эти данные в dxDataGrid, используя AngularJs и DevExtreme. Таким образом, столбец Company будет найден, и идентификатор выбранной компании будет связан с CompanyID.

Я хотел бы добиться чего-то вроде:

$scope.dataGridOptions = {
    dataSource: customers,
    columns: ["Name", 
              { 
                dataField: "CompanyID", 
                lookup: {
                        dataSource:customers[rowindex].Company,
                        valueExpr: 'ID', 
                        displayExpr: 'Name'
                        },
                 caption: 'Company' 
                }]
};

person BipinBaglung    schedule 11.04.2017    source источник


Ответы (2)


Вы можете добавить editCellTemplate в столбец для достижения вашей цели. Что-то подобное:

$scope.valueChangeAction = function (e) {
    this.setValue(e.value);
};
...
columns: [{ 
    dataField: "CompanyID",
    editCellTemplate: "lookupEditCell"
}]

И определите шаблон:

<div data-options="dxTemplate:{ name:'lookupEditCell' }" dx-item-alias="cell">
    <div dx-lookup="{
        dataSource: cell.data.Company,
        valueExpr: 'ID',
        displayExpr: 'Name',
        onValueChanged: $parent.valueChangeAction
    }"></div>
</div>
person Dmitry Levkovsky    schedule 11.04.2017
comment
кажется, что row следует использовать как dx-item-alias, но я не мог настроить обычную ячейку для отображения текста Name вместо значения идентификатора. Также нужно дважды щелкнуть, чтобы открыть всплывающее окно. Как показать тот же шаблон и для обычного просмотра? - person BipinBaglung; 11.04.2017

Как уже упоминалось @Dmitry, добавление editCellTemplate может использоваться для представления данных. Но dx-item-alias может и не потребоваться.

[JAVASCRIPT]

$scope.Customers =  [{
      "Name": "John Mayor",
      "CompanyId": 1,
      "Company": [{"ID": 1,"Name": "Super Mart"}, {"ID": 2,"Name": "Big Mart"}]
    }, {
      "Name": "Rick Bard",
      "CompanyId": 2,
      "Company": [{ "ID": 1, "Name": "Google" }, { "ID": 2, "Name": "Oracle" }]
    }];

  $scope.dataGridOptions= {
    dataSource: $scope.Customers,
    editing: {
      mode: 'cell',
      allowUpdating: true,
    },
    columns: [{
      dataField: "Name",
      allowEditing: false

    }, {
      dataField: 'CompanyId',
      allowEditing: true,
      showEditorAlways: true,
      editCellTemplate: 'lookupCell',
      caption:'Company'
    }]
  }

  $scope.getOnValueChangeAction = function(row) {
    return function(e) {
        row.setValue(e.value);
    }    
  };

[HTML]

<div dx-data-grid="dataGridOptions">
    <div data-options="dxTemplate:{ name:'lookupCell' }">
        <div dx-select-box="{
                        dataSource: data.Company,
                        value: data.CompanyId,
                        valueExpr: 'ID',
                        displayExpr: 'Name',
                        onValueChanged: $parent.getOnValueChangeAction(this)
                       }">
        </div>
    </div>
</div>
person BipinBaglung    schedule 13.04.2017