Нужна помощь в настройке отношения модели hasMany для вложенного JSON и отображении данных в сетке - EXTJS 6 - PullRequest
0 голосов
/ 27 июня 2018

Я получаю некоторые результаты поиска от Elastic в этом формате

{
  "took": 267,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1911,
    "max_score": 29.118078,
    "hits": [
      {
        "_index": "myIndex",
        "_type": "doc",
        "_id": "27c9d14495f7732c6756f0d2688874f",
        "_score": 21.179974,
        "_source": {
          "file": {
            "filename": "file1.pdf"
          },
          "content": "samplecontent"
        }
      },
      {
        "_index": "myIndex",
        "_type": "doc",
        "_id": "27c9d14495f7732c6756f0d2688874f",
        "_score": 21.179974,
        "_source": {
          "file": {
            "filename": "file2.pdf"
          },
          "content": "samplecontent"
        }
      },
      {
        "_index": "myIndex",
        "_type": "doc",
        "_id": "27c9d14495f7732c6756f0d2688874f",
        "_score": 21.179974,
        "_source": {
          "file": {
            "filename": "file3.pdf"
          },
          "content": "samplecontent"
        }
      }
    ]
  }
}

и хотел бы, например, отображать hit.total (1911) в заголовке моей сетки, а также hit.hits._source.file.filename и hit.hits._source.content в моей сетке. Я полагаю, что мне нужно настроить модель hasMany / ownTo, но меня немного смущают какие-либо документы / примеры, которые я нашел в отношении того, как настроить это отношение, а также выбрать и выбрать эти вложенные поля для отображения в сетке. Любая помощь или разъяснения будут оценены

Мой магазин определен как

Ext.define('search.store.results', {
    extend: 'Ext.data.Store',

    alias: 'store.results',

    model: 'search.model.hits',

    autoLoad: false,

    proxy: {
        type: 'ajax',
        url: 'http://myServer:9200/_search',
        reader: {
            type: 'json',
            rootProperty: 'hits'
        }
    }
});

А мои модели определены как

база

Ext.define('search.model.Base', {
    extend: 'Ext.data.Model',

    schema: {
        namespace: 'search.model'
    }
});

хиты

Ext.define('search.model.hits', {
    extend: 'search.model.Base',

    fields: [
        {name: 'total', type: 'number'}
    ],
    hasMany:{
        model: 'hit',
        name: 'hit'
    }
});

хит

Ext.define('search.model.hit', {
    extend: 'search.model.Base',

    fields: [
        {name: '_source', type: 'source'}
    ]
});

источник

Ext.define('search.model.source', {
    extend: 'search.model.Base',

    fields: [
        {name: 'file', type: 'file'},
        {name: 'content', type: 'string'}
    ]
});

и файл

Ext.define('search.model.file', {
    extend: 'search.model.Base',

    fields: [
        {name: 'filename', type: 'string'}
    ]
});

однако, когда я загружаю свою страницу, я сразу же получаю эти ошибки

Uncaught Error: [Ext.createByAlias] Unrecognized alias: data.field.source

и

Uncaught Error: [Ext.createByAlias] Unrecognized alias: data.field.file

ОБНОВЛЕНИЕ: Вот как будут выглядеть результаты, если я поменяю свои модели на использование 'reference' вместо hasMany

Ext.define('search.model.hits', {
    extend: 'search.model.Base',

    fields: [
        {name: 'total', type: 'number'},
        {name: 'hits', reference: 'hit'}
    ]
});

Ext.define('search.model.hit', {
    extend: 'search.model.Base',

    fields: [
        {name: '_source', reference: 'source'}
    ]
});

Ext.define('search.model.source', {
    extend: 'search.model.Base',

    fields: [
        {name: 'file', reference: 'file'},
        {name: 'content', type: 'string'}
    ]
});

Ext.define('search.model.file', {
    extend: 'search.model.Base',

    fields: [
        {name: 'filename', type: 'string'}
    ]
});

Прослушиватель «load» моего магазина отображает эту информацию, разбитую на отдельные структуры данных, вместо того, чтобы все находилось под структурой «data», где находится стрелка (где я привык находить записи своего хранилища)

enter image description here

ОБНОВЛЕНИЕ № 2: Если я изменяю свою модель «хитов» для использования hasMany, но оставляю остальное с помощью «ссылки», кажется, что это сработает, если правильно сгруппировать мои данные в записях - теперь мне просто нужно знать, как отображать вложенные результаты в сетке

Ext.define('search.model.hits', {
    extend: 'search.model.Base',

    fields: [
        {name: 'total', type: 'number'}
    ],
    hasMany:{
        model: 'hit',
        name: 'hit'
    }
});

производит

enter image description here

...