2014-01-21 9 views
1

Какие шаблоны были успешными при сопоставлении модели с несколькими повторяющимися структурами. Мне нужно смоделировать и создать сетку с записью с несколькими столбцами, которые в основном являются одной и той же повторяющейся структурой.Модель ExtJS с повторяющимися структурами

Ext.define('Ep.mm.model.MyComparison', { 
var derived = function(val,) 
    extend: 'Ext.data.Model', 
    fields : [ 
     {name:'id',type:'string'}, 
     {name:'count',type:'number'}, 
     {name:'special',type:'number'}, 
     {name:'A_a',type:'number'}, 
     {name:'A_b',type:'number'} 
     {name:'A_derived',renderer = function(val,meta,rec){return rec.get('A_b')-rec.get('A_a')}} 
     {name:'B_a',type:'number'}, 
     {name:'B_b',type:'number'} 
     {name:'B_derived',renderer = function(val,meta,rec){return rec.get('B_b')-rec.get('B_a')}} 
     {name:'C_a',type:'number'}, 
     {name:'C_b',type:'number'} 
     {name:'C_derived',renderer = function(val,meta,rec){return rec.get('C_b')-rec.get('C_a')}} 
    ] 
}); 

я, вероятно, в конечном итоге с моделями/магазинах, которые отличаются только в число раз эта структура сервера повторы (А) (А, В) (А, В, С, D). Есть ли способ использовать общую модель для каждого из A, B, C, D и просто повторно использовать общую модель в качестве типа. Это нечто похожее на «вложенную» структуру.

Ext.define('MyType',{ 
    extend :'Ext.data.Model', 
    fields : [ 
     {name : 'a', type:'number'}, 
     {name : 'b', type:'number'}, 
     { name : 'derived', 
     convert : function(value, record) { 
      return record.get('a') - record.get('b'); 
     } 
     } 
    ] 
} 

Тогда MyComparison будет определяться как

Ext.define('Ep.mm.model.MyComparison',{ 
    extend : 'Ext'data.Model', 
    fields : [ 
     {name:'A', type:'MyType'} 
     {name:'B', type:'MyType'} 
     {name:'C', type:'MyType'} 
    ] 
}); 

Я знаю, что это не совсем правильно, но это своего рода функциональности я пытаюсь создать. Возможно, используя тип ассоциации 'hasOne'?

ответ

1

Да, вы можете расширить свои собственные классы модели:

Ext.define('Base', { 
    extend: 'Ext.data.Model', 
    fields: ['name'] 
}); 

Ext.define('Child', { 
    extend: 'Base', 
    fields: ['age'] 
}); 

var o = new Child({ 
    name: 'Foo', 
    age: 100 
}); 
console.log(rec.get('name'), rec.get('age')); 

Как Замечание, модели не имеют рендеры. Вероятно, вы ищете функцию преобразования в поле, here.

0

Я бы сказал, что вы хотите функциональность поля type:

Ext.data.Types.A_DERIVED = { 
    convert: function(v, data) { 
     return rec.get('A_b')-rec.get('A_a'); 
    }, 
    type: 'number' 
}; 

Затем использовать его как тип A_derived поля:

Ext.define('Ep.mm.model.MyComparison', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     {name:'id',type:'string'}, 
     {name:'A_a',type:'number'}, 
     {name:'A_b',type:'number'}, 
     {name:'A_derived', type: 'Ext.data.Types.A_DERIVED'} 
    ] 
}); 

запоздалые:
- Может быть, вы хотели бы агрегировать все данные A_* в одно поле? См. Пример documentation.
- Существует проблема, когда вы хотите использовать тот же механизм с B_derived, потому что нет способа поставить B в функцию convert. Грязным взломом может быть установка defaultValue на B и привязка поля к нулевым данным. Затем v будет считан от defaultValue.

+0

Это довольно близко к тому, что я думал, в сочетании с агрегированием всех данных A_ * в одно поле, все данные B_ * в другое поле. Поскольку данные A_ * и B_ * имеют одинаковый набор полей, я надеялся, что их способ использовать другую модель в качестве типа поля. Я уточню вопрос, чтобы прояснить это. – gbegley

Смежные вопросы