Можно ли использовать пользовательские переменные в хранилище extjs?

В настоящее время я работаю над проектом, использующим ExtJs (версия 5.0.1). Поскольку я часто создаю магазины, я хотел создать своего рода шаблон для копирования или даже расширения.

Поэтому мне было неприятно каждый раз редактировать путь, и я создал переменную выше let controller (до того, как я использовал const, но, поскольку вызывалось более одного хранилища, это приводило к некоторым ошибкам)

let controller = "path/to/my/controller/myController.php";

Ext.define("xxx.store.foo.bar.myStore", {
    extend: "Ext.data.Store",
    model: "xxx.model.foo.bar.myModel",
    proxy: {
        type: "ajax",
        timeout: 20000,
        api: {
            read: controller + "?data=read",
            create: controller + "?data=create",
            update: controller + "?data=update",
            destroy: controller + "?data=delete",
        },
        reader: {
            type: "json",
            rootProperty: "data",
            idProperty: "id",
            totalProperty: "total",
        },
        writer: {
            type: "json",
            encode: true,
            writeAllFields: true,
            rootProperty: "data",
            idProperty: "id",
        },
    },
    autoLoad: false,
});

Однако меня это не устраивает, и я бы предпочел какую-нибудь внутреннюю переменную. Что-то вроде:

Ext.define("xxx.store.foo.bar.my", {
    extend: "Ext.data.Store",
    model: "xxx.model.foo.bar.my",
    myControllerPath: "this/is/my/path/to/my/controller",
    proxy: {
        type: "ajax",
        timeout: 20000,
        api: {
            read: this.myControllerPath + "?data=read",
            create: this.myControllerPath + "?data=create",
            update: this.myControllerPath + "?data=update",
            destroy: this.myControllerPath + "?data=delete",
        },
        ....

Но this. там так использовать нельзя! (очевидно)

Каким может быть решение моей проблемы... как я могу использовать там пользовательскую переменную?


71
1

Ответ:

Решено

Одним из решений может быть добавление пользовательского свойства для пути контроллера к определению класса хранилища шаблонов и использование constructor для установки прокси на основе этого пути. Таким образом, вы уже сможете использовать ключевое слово this. Позже вы используете этот шаблон для определения классов вашего магазина.

Посмотрите этот код, надеюсь, он поможет:

Ext.define("MyStoreTemplate", {
    extend: "Ext.data.Store",
    myController: null,
    constructor: function (config) {
        this.setProxy({
            type: "ajax",
            timeout: 20000,
            api: {
                read: this.myController + "?data=read",
                create: this.myController + "?data=create",
                update: this.myController + "?data=update",
                destroy: this.myController + "?data=delete",
            },
            reader: {
                type: "json",
                rootProperty: "data",
                idProperty: "id",
                totalProperty: "total",
            },
            writer: {
                type: "json",
                encode: true,
                writeAllFields: true,
                rootProperty: "data",
                idProperty: "id",
            },
        });
    },
    autoLoad: false,
});

Ext.define("MyModel", {
    extend: "Ext.data.Model",
});

Ext.define("MyStore", {
    extend: "MyStoreTemplate",
    myController: "path/to/my/controller/myController.php",
    model: "MyModel",
});

const myStore = Ext.create("MyStore");

console.info(myStore.getProxy());