2012-10-13 8 views
9

Jak przedłużyć niestandardowy model w extjs.Rozszerz od niestandardowej klasy modelu w ExtJS 4

Czy istnieje metoda, która może bezpośrednio zabandażować pola pól User i BusinessUser, gdy będę odsyłać pola z klasy BusinessUser w poniższym przykładzie.

Ext.define('User', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     {name: 'name', type: 'string'}, 
     {name: 'age', type: 'int'}, 
     {name: 'phone', type: 'string'}, 
     {name: 'alive', type: 'boolean', defaultValue: true} 
    ], 
}); 

Ext.define('BusinessUser', { 
    extend: 'User', 
    fields: [ 
     {name: 'businessType', type: 'string'}, 
     {name: 'company', type: 'string'} 
    ], 
}); 

Odpowiedz

15

Nie trzeba dołączyć pola ręcznie, ponieważ jest to zrobione automatycznie. Sprawdź wyjścia w poniższym kodzie w oparciu o twoje pytanie:

Ext.define('User', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     {name: 'name', type: 'string'}, 
     {name: 'age', type: 'int'}, 
     {name: 'phone', type: 'string'}, 
     {name: 'alive', type: 'boolean', defaultValue: true} 
    ], 
}); 

Ext.define('BusinessUser', { 
    extend: 'User', 
    fields: [ 
     {name: 'businessType', type: 'string'}, 
     {name: 'company', type: 'string'} 
    ], 
}); 

// instantiating a User object 
var u = Ext.create('BusinessUser', { 
    name: 'John Doe', 
    age: 30, 
    phone: '555-5555' 
}); 

// instantiating a BusinessUser object 
var bu = Ext.create('BusinessUser', { 
    name: 'Jane Doe', 
    age: 40, 
    phone: '555-5556', 
    businessType: 'analyst', 
    company: 'ACME' 
}); 

console.log(Ext.getClassName(bu)); // "BusinessUser" 
console.log(Ext.getClassName(u)); // "User" 
console.log(u instanceof User); // true 
console.log(bu instanceof User); // true 
console.log(u instanceof BusinessUser); // false 
console.log(bu instanceof BusinessUser); // true 
console.log(u instanceof Ext.data.Model); // true 
console.log(bu instanceof Ext.data.Model); // true 
console.log(u instanceof Ext.data.Store); // false, just to check if it's not returning true for anything 
console.log(bu instanceof Ext.data.Store); // false 
console.log("name" in u.data); // true 
console.log("name" in bu.data); // true 
console.log("company" in u.data); // false 
console.log("company" in bu.data); // true 
+0

Wygląda jak błąd, ale ... 'console.log (Ext.getClassName (bu)); // "BusinessUser" ' ' console.log (Ext.getClassName (u)); // "Użytkownik" ' wypisze' BusinessUser' oba razy , a testy dla 'instanceof' dostarczą odpowiednio dane wyjściowe – bam

6

Mimo to powinno działać automatycznie, użyj poniżej, jeśli masz problemy z jakiegoś powodu.

użyć konstruktora dołączyć do pola:

Ext.define('BusinessUser', { 
    extend : 'User', 
    constructor : function(){ 
     this.callParent(arguments); 
     this.fields.push([ 
     {name: 'businessType', type: 'string'}, 
     {name: 'company', type: 'string'} 
    ]); 
    } 
}); 
+0

To powinno działać, odpowiedź poniżej jest poprawna. Proszę odnieść się do niego, ponieważ robi to automatycznie. – codemonkeyww