2011-01-14 2 views
0

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

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); 

ответ

0

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

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

  1. Rename myCustomParam к this.myCustomParam и испытания
  2. Установить масштаб и тест
  3. Создать getDwrArgsFunction используя createDelegate (HTTP : //dev.sencha.com/deploy/dev/docs/source/Function.html#method-Ext.util.Functions-createDelegate) и тест

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

0

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

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

Изменение:

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

Привет Роб, спасибо за ваш пост. Означает ли это, что я не смог бы изменить myCustomParam при создании сетки - мне нужно создать экземпляр MyEmployeeGrid для каждой компании, поэтому изменяя myCustomParam при объявлении сетки – James

+0

Привет, Джеймс, я немного изменил код, потому что это было неверно, объявление переменной не нужно «это» перед этим. Используя вышеизложенное, вы можете установить значение по умолчанию для переменной и переопределить ее с помощью настраиваемого во время инициализации вашего экземпляра.Надеюсь, это поможет, дайте мне знать –

1

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

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

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

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

    // ... do stuff ... 

    MyGrid.superclass.constructor.call(this, cfg); 
    } 
}); 
+0

Спасибо за ваш ответ. Не могли бы вы прояснить, как инсталлировать MyGrid с помощью конструктора. Это просто 'new MyGrid ({customParam:" value "});'? Как насчет xtype? – James

+0

Я обновил его, чтобы этот метод выше работал. Каждое свойство в элементе 'cfg' будет свойством в новой сетке. Если вы зарегистрируете 'MyGrid', вы сможете построить его с помощью' xtype'. (например, 'Ext.reg (MyGrid, 'my-grid');') – wombleton

+0

+1 для предложения конструктора. Я считаю, что функция-конструктор - Ext 3.x + предпочтительный способ создания вашего собственного компонента. Код Ext использует его. – ndtreviv