2011-02-18 87 views
2

我想延長Ext.grid.TemplateColumn(http://dev.sencha.com/deploy/dev/docs/?class=Ext.grid.TemplateColumn)類使用預定義Xtemplate,但是我想它仍然能夠運行時渲染一個在傳遞。如何在擴展Ext.grid.TemplateColumn類時添加自定義渲染器?

在我理解,TemplateColumn不接受自定義的渲染器,因此我修改了我的類來擴展Ext.grid.Column。然而,然後我意識到傳入的渲染器本身就是一個函數。我敢肯定,我不能將兩個函數合併爲一個,所以我堅持嘗試將我的Xtemplate應用到該列,並應用傳入的渲染器。

我也嘗試了createInterceptor,但它不工作。

this.renderer.createInterceptor(function(value, p, r){ 
    return tpl.apply(r.data); 
}); 

如有必要,將發佈其他代碼。

+0

ExtJS的擴展了`Function`對象包括`createSequence`和`createInterceptor`功能,允許您有效地將功能合併到一個http://dev.sencha.com/deploy/dev/docs/?class=Function – 2011-02-18 12:45:34

+0

是的,我也試過,以及,例如: this.renderer.createInterceptor(function(value,p,r){return tpl.apply(r.data);};)但它不起作用 – CincauHangus 2011-02-18 12:56:30

回答

1

TemplateColumn在其構造函數中定義了自己的渲染器,因此它將覆蓋任何傳入的渲染器配置選項。下面是TemplateColumn中的構造:

constructor: function(cfg){ 
    Ext.grid.TemplateColumn.superclass.constructor.call(this, cfg); 
    var tpl = (!Ext.isPrimitive(this.tpl) && this.tpl.compile) ? this.tpl : new Ext.XTemplate(this.tpl); 
    this.renderer = function(value, p, r){ 
     return tpl.apply(r.data); 
    }; 
    this.tpl = tpl; 
} 

如果你想有一個自定義渲染,你可以先創建的序列做渲染一個createInterceptor或createSequence它在TemplateColumn中原型的構造函數...被設置後構造函數,然後創建使用的配置對象傳遞在渲染器的渲染器攔截器......這樣的:

Ext.grid.TemplateColumn.prototype.constructor = Ext.grid.TemplateColumn.prototype.constructor.createSequence(function(config) { 
    this.renderer = this.renderer.createInterceptor(config.renderer); 
}); 
相關問題