2014-01-21 5 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')}} 
    ] 
}); 

는 I 서버 모델/횟수 만 다른 점포로 끝날 가능성이 생각이 구조 반복 (A) (A, B) (A, B, C, 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). 어쩌면 당신이 원하는 -
: 다음

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'} 
    ] 
}); 

뒤늦게 추가

0

난 당신이 필드 type의 기능을 원하는 말할 것 모든 A_* 데이터를 하나의 필드에 집계 하시겠습니까? 예를 들어 documentation을 참조하십시오.
- B_derived과 동일한 메커니즘을 사용하려는 경우 함수에 B을 제공 할 방법이 없으므로 문제가 있습니다. 더러운 해킹은 defaultValueB으로 설정하고 필드를 null 데이터에 바인딩하는 것일 수 있습니다. 그런 다음 vdefaultValue에서 읽을 수 있습니다.

+0

이것은 모든 A_ * 데이터를 하나의 필드로 모으고, 모든 B_ * 데이터를 다른 필드로 모으는 것과 결합하여 생각했던 것과 매우 흡사합니다. A_ * 데이터와 B_ * 데이터는 동일한 필드 집합을 갖고 있기 때문에 다른 모델을 필드 유형으로 사용하는 방법이 필요했습니다. 이 질문을 명확히하기 위해 업데이트하겠습니다. – gbegley