ExtJs: нужна помощь в разработке структуры модели - PullRequest
0 голосов
/ 18 апреля 2019

Я являюсь частью проекта, в котором ExtJs должен использоваться для разработки внешнего интерфейса.Бэкэнд-разработчики собираются предоставить API, и я должен его использовать.

Есть несколько API, которые возвращают JSON в формате ниже

{
    "Entity": [
        {
            "id": 1,
            "name": "Sunshine",
            "placements": 3,
            "next_meeting": "2019-03-14T16:29:00.48Z"
        },
        {
            "id": 2,
            "name": "Merlon",
            "placements": 1,
            "next_meeting": "2019-03-14T16:29:00.48Z"
        },
        {
            "id": 3,
            "name": "Mars",
            "placements": 10,
            "next_meeting": "2019-03-14T16:29:00.48Z"
        },
        {
            "id": 4,
            "name": "Moonlight",
            "placements": 5,
            "next_meeting": "2019-03-14T16:29:00.48Z"
        }
    ],
    "RecordCount": 4,
    "IsSuccess": true,
    "Unauthorized": false,
    "ErrorInformation": {
        "Message": null,
        "Link": null
    }
}

На данный момент я создаюотдельные модели, как показано ниже
ClientModel.js

Ext.define('ClientModel', {
    extend: 'Ext.data.Model',
    fields: [{
            name: "id",
            type: "int",
            convert: null
        },
        {
            name: "name",
            type: "string"
        },
        {
            name: "placements",
            type: "int",
            convert: null
        },
        {
            name: "next_meeting",
            type: "date",
            dateFormat: 'm/d/Y',
            convert: function(v, rec) {
                return Ext.util.Format.date(v, 'm/d/Y');
            }
        }
    ],
    proxy: {
        type: "ajax",
        url: "/api/Clients",
        reader: {
            type: "json",
            rootProperty: "Entity",
            totalProperty: "RecordCount",
            successProperty: "IsSuccess"
        }
    }
});

В поисках лучшего подхода, поскольку все API возвращают ответ в заданной форме.

Как создать базовую модель, которая должна служитьв качестве родителя других моделей?

Я хотел бы разработать свою модель следующим образом:

Ext.define('ParentModel', {
extend: 'Ext.data.Model',
fields: [
    {
        name: 'Entity'
    },
    {
        name: 'RecordCount',
        type: 'int'         
    },
    {
        name: 'IsSuccess',
        type: 'boolean'
    },
    {
        name: 'Unauthorized',
        type: 'boolean'
    },
    {
        name: 'ErrorInformation'
    }
]
});

Теперь, скажем, для API '/ API / клиентов' я получаю ответ, который изображаетКлиентская модель, поэтому поле Entity должно ссылаться или указывать на ClientModel.

Аналогично, допустим, у меня есть еще один api '/ api / comments', который изображает CommentModel, теперь поле сущности должно ссылаться или указывать на CommentModel.

1 Ответ

0 голосов
/ 18 апреля 2019

Вы можете создать ParentProxy:

Ext.define('ParentProxy', {
    alias: 'proxy.parentProxy',
    extend: 'Ext.data.proxy.Ajax',
    type: "ajax",
    url: "/api/Clients"
    reader: {
        type: "json",
        rootProperty: "Entity",
        totalProperty: "RecordCount",
        successProperty: "IsSuccess"
    }
});

Далее вы можете создать ParentModel:

Ext.define('ParentModel', {
    extend: 'Ext.data.Model',
    fields: [
        {
            name: "id",
            type: "int",
            convert: null
        },
        {
            name: "name",
            type: "string"
        },
        {
            name: "placements",
            type: "int",
            convert: null
        },
        {
            name: "next_meeting",
            type: "date",
            dateFormat: 'm/d/Y',
            convert: function(v, rec) {
                return Ext.util.Format.date(v, 'm/d/Y');
            }
        }
    ],
    proxy: {
        type: "parentProxy"
    }
});

И создайте ChildModel (если поля одинаковы):

Ext.define('ChildModel', {
    extend: 'ParentModel',
    proxy: {
        url: "/api/ChildClients"
    }
});

И создайте ChildModel (если поля не совпадают):

Ext.define('ChildModel2', {
    extend: 'ParentModel',
    fields: [
        {
            name: "id",
            type: "int",
            convert: null
        },
        {
            name: "name",
            type: "string"
        },
        {
            name: "status",
            type: "int"
        }
    ],
    proxy: {
        url: "/api/ChildClients"
    }
});

EDIT: На мой взгляд, это плохая модель в extjs. Одна вещь, которую вы можете сделать, это ассоциация в модели.

например. ссылка

fields: [{ 
    name: 'Entity', 
    reference: 'CommentsModel'
}]

например. hasOne , это выглядит так:

hasOne: [{
    model: "CommentModel",
    name:"Entity",
    associationKey: "Entity"
}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...