2013-02-25 3 views
0

J'ai un modèle client défini comme:Comment appeler une fonction de modèle dans Sencha Modèle

Ext.define('app.model.Client', { 
    extend: 'Ext.data.Model', 
    alias: 'model.clientmodel', 
    fields: [ 
     { 
      name: 'Firstname', 
      type: 'string' 
     }, 
     { 
      name: 'Lastname', 
      type: 'string' 
     }, 
     { 
      name: 'Title', 
      type: 'string' 
     } 
    ], 
    GetFullName: function(withTitle) { 
     var fullName = [this.get('Firstname'), this.get('Lastname')].join(' '); 

     if(withTitle){ 
      return [this.get('Title'), fullName].join(' '); 
     } 

     return fullName; 
    } 
}); 

Dans une grille, je veux avoir un « nom complet » colonne de modèle - est-il un moyen d'appeler la GetFullName méthode définie dans mon modèle?

Merci

Répondre

1

La solution que j'ai trouvée consistait à utiliser la fonction template pour obtenir une référence aux données du client et appeler GetFullName là-dessus. Je voudrais pouvoir transformer cela en une classe réutilisable, mais je ne suis pas sûr de savoir comment obtenir une référence à la grille (car ce ne sera pas toujours sur MyGrid).

{ 
    xtype: 'templatecolumn', 
    dataIndex: 'Lastname', 
    text: 'Name', 
    tpl: new Ext.XTemplate('{[this.getFullName(values.ID)]}', 
    { 
     getFullName: function (clientId) { 
      var myGrid = Ext.getCmp('MyGrid'), 
      myStore = myGrid.getStore(), 
      client = myStore.getById(clientId); 

      return client.GetFullName(true); 
     } 
    } 
    ) 
} 
+1

Cela ne fonctionnera pas si vous n'avez pas de magasin, mais je suppose que vous avez probablement un magasin, sinon appelez simplement la fonction sur l'instance de votre modèle. Si vous utilisez une vue, remplacez myGrid par votre vue et modifiez la requête de votre composant. –

1

Vous pouvez utiliser le code ci-dessous convertir comme

Ext.define('app.model.Client', { 
extend: 'Ext.data.Model', 
alias: 'model.clientmodel', 
fields: [ 
    { 
     name: 'Firstname', 
     type: 'string' 
    }, 
    { 
     name: 'Lastname', 
     type: 'string' 
    }, 
    { 
     name: 'Title', 
     type: 'string' 
    }, 
    { 
     name: 'FullName', 
     type: 'string', 
     convert: function(value,record) { 
      var fullName = [record.get('Firstname'), record.get('Lastname')].join(' '); 

      if(withTitle){ 
       return [record.get('Title'), fullName].join(' '); 
      } 

      return fullName; 
     } 
    } 

] 

});

maintenant vous pouvez utiliser la colonne FullName dans la grille dataIndex.

+0

Merci, cela a fonctionné - sauf pour la partie withTitle - je suppose que ce n'est pas possible avec cette approche? – Brett

+0

Non, vous ne pourrez pas passer le paramètre avecTitre ici. Vous devrez utiliser une autre approche, quelque chose comme l'autre réponse. –

Questions connexes