Использование пользовательских атрибутов в ExtJS Component - PullRequest
0 голосов
/ 14 января 2011

Мое приложение росло в течение последнего года или около того, и я наконец начал разделять общие компоненты, расширяя существующие.Я нашел, что это действительно полезно - увеличение скорости разработки и сопровождения.Моя проблема в том, что я не понял концепции использования пользовательских параметров в моих компонентах и ​​надеялся, что кто-то может предложить некоторую помощь в следующем примере.В частности, я не могу получить доступ к пользовательскому параметру (myCustomParam) внутри прокси-сервера, объявленного в функции initComponent:

MyEmployeeGrid = Ext.extend(Ext.grid.GridPanel, {
 myCustomParam: "CompanyX",
 initComponent:function() {
    //Store Reader
    var myReader = new Ext.data.JsonReader({
        root : 'objectsToConvertToRecords',
        idProperty: 'id',
        fields : [
            {name: 'id'},
            {name: 'employee', allowBlank:false},
            {name: 'department', allowBlank:false}
        ]
    });

    //Store Proxy
    var dwrProxy = new Ext.ux.data.DwrProxy({
            apiActionToHandlerMap : {
            read : {
                dwrFunction : EmployeeService.readCompanyEmployees,
                getDwrArgsFunction: function(request, recordDataArray, oldRecordDataArray) {
                    return [myCustomParam];
                }
            }
        }
    });

    //Setup Params for the grid
    Ext.apply(this, {
        store: new Ext.data.Store({
             proxy: dwrProxy,
            reader: myReader,
            autoLoad : true,
            autoSave: true
        }),
        columns: [{header: "Employee", dataIndex: 'employee'},
                    {header: "Department", dataIndex: 'department'}]
    });

    MyEmployeeGrid.superclass.initComponent.apply(this, arguments);
} // eo function initComponent

,onRender:function() {
    MyEmployeeGrid.superclass.onRender.apply(this, arguments);
} // eo function onRender

});

Ext.reg('myemployeegrid', MyEmployeeGrid);

Ответы [ 3 ]

1 голос
/ 14 января 2011

myCustomParam является свойством рассматриваемого объекта.Он никогда не объявляется как переменная сама по себе.Вы можете убедиться в этом, запустив код через jslint .

Вы хотите this.myCustomParam.

Однако, если вы пытаетесь передать параметры, вы можете попробовать вместо этого:

MyGrid = Ext.extend(Ext.grid.GridPanel, {
  constructor: function(cfg) {
    cfg = cfg || {};

    // ... do stuff ...

    MyGrid.superclass.constructor.call(this, cfg);
  }
});
0 голосов
/ 14 января 2011

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

Вы можете решить вашу проблему, явно передав область действия сетки функции-обработчику, сделав ее делегатом, для чего вам нужно изменить это создание переменной, к которой вы хотите обращаться к переменной экземпляра, а не просто локальная переменная.

Изменения:

MyEmployeeGrid = Ext.extend(Ext.grid.GridPanel, {
    myCustomParam: "defaultValue",
    initComponent:function() {
    ...
    //Store Proxy
    var dwrProxy = new Ext.ux.data.DwrProxy({
            apiActionToHandlerMap : {
            read : {
                dwrFunction : EmployeeService.readCompanyEmployees,
                getDwrArgsFunction: function(request, recordDataArray, oldRecordDataArray) {
                    return [this.myCustomParam];
                }.createDelegate(this)
            }
        }
    });

var myGridInstance = new MyEmployeeGrid({ myCustomParam: 'ValueForThisInstance' });

Надеюсь, это поможет вам, удачи

0 голосов
/ 14 января 2011

У меня сильное чувство, что это связано с областью видимости вокруг точки, в которой вызывается функция getDwrArgsFunction. Возможно, он не знает, что такое myCustomParam (несмотря на то, что это может быть this.myCustomParam, и что вы захотите установить его после применения любой конфигурации), поскольку он не объявлен в объекте DwrProxy и не имеет ссылки обратно к собственному объекту MyEmployeeGrid.

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

  1. Переименуйте myCustomParam в this.myCustomParam и тест
  2. Установить область действия и проверить
  3. Создание функции getDwrArgs с помощью createDelegate (* 1 010 * и проверить

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Некоторые из них будут бесполезны в зависимости от вашего DwrProxy и т. Д. (Для которого мы не видим код)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...