Stir Zoltán
Stir Zoltán

Reputation: 4053

Ext.Template is not defined

I'm having trouble preparing my application for deployment. I'm using ext-dev.js and have a compnent with the following:

Ext.define(myNameSpace.myComponentName, {
    requires: ['Ext.XTemplate'],
    tpl: new Ext.XTemplate('someTemplate')
})

On application startup it gives an

Ext.XTemplate is not a constructor

Do you have a solution for this?

Upvotes: 1

Views: 1202

Answers (1)

Ruan Mendes
Ruan Mendes

Reputation: 92294

You cannot define Ext.XTemplate inline because it hasn't been retrieved from the server yet by the Ext.Loader which handles loading of dependencies. There are two solutions:

// If you really want to add it to the prototype, but adding objects to the 
// prototype is usually a bad idea since they are shared by all instances 
// In this case, it may be ok, since there isn't much you can change about a
// template after you create it
Ext.define('myNameSpace.myComponentName', {
    requires: ['Ext.XTemplate'],
}, function() {
   // This callback is for when all the dependencies are loaded
   myNameSpace.myComponentName.prototype.tpl = new Ext.XTemplate('someTemplate')
});

// Or just define it in initComponent, since you shouldn't instantiate it
// until after Ext.onReady is called (which means all dependencies are loaded)
Ext.define('myNameSpace.myComponentName', {
    requires: ['Ext.XTemplate'],
    initComponent: function() {
       this.tpl = new Ext.XTemplate('someTemplate');
       this.callParent();
    }
});

UPDATE I actually forgot to list another possibility that may work, that is, don't use new, use Ext.create('Ext.XTemplate', args)'. The problem with Ext.create is that it will block until Ext.XTemplate (and dependencies) is loaded. I would still go with one of two approaches mentioned at the top

Upvotes: 2

Related Questions