В настоящее время я работаю над проектом, использующим 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.
там так использовать нельзя! (очевидно)
Каким может быть решение моей проблемы... как я могу использовать там пользовательскую переменную?
Одним из решений может быть добавление пользовательского свойства для пути контроллера к определению класса хранилища шаблонов и использование 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());