2016-01-22 37 views
0

我的treecolumn有一個ComboBox作爲編輯器組件。在選項菜單中的選項與HTML正確地呈現,但輸入框不渲染HTML,那隻能說明標籤(見以下圖片)。將文本顯示爲HTML的組合框

我怎樣才能使它也呈現值作爲HTML?

P.S. 該解決方案在這裏EXTJS 4 render HTML of a selected value in a combobox是好像不extjs6版本的工作,檢查here

First step

Second step

這裏的問題所在代碼(rendere萬一depth.TypeParameter:返回HTML標記文本)

{ 
        xtype: 'treecolumn', 
        dataIndex: 'text', 
        text: Poly.utils.locale.Base.localeName, 
        flex: 1, 
        getEditor: function (record) { 
         return me.getController().getEditor(record); 
        }, 
        renderer: function (value, meta, record) { 
         var depth = Poly.view.fluidProperties.sample.Tree.depth; 
         switch (record.getDepth()) { 
          case depth.Temperature: 
           if (Ext.isEmpty(record.get('temperature'))) { 
            return value; 
           } 
           var text = Ext.String.format('T = {0} {1}', 
            record.get('temperature').toFixed(2), 
            Poly.utils.UniSum.GetUnit(me.getViewModel().get('temperatureUnitId')).name); 

           return text; 
          case depth.TypeParameter: 
           if (record.get('isNew')) { 
            return value; 
           } 
           return Poly.enums.TypeFluidParameter.getName(record.get('fluidParameter'), record.parentNode.get('typeFluid'), true); 
         } 
         return value; 
        } 
       } 

Full code here

Ext.define('Poly.view.fluidProperties.sample.Tree', { 
    extend: 'Ext.tree.Panel', 

    xtype: 'fluidPropertiesSampleTree', 

    viewModel: { 
     type: 'fluidPropertiesSampleTreeViewModel' 
    }, 

    controller: 'fluidPropertiesSampleTreeController', 

    statics: { 
     /** Уровень элемента в дереве */ 
     depth: { 
      /** Корень */ 
      Root: 0, 
      /** Замер */ 
      Sample: 1, 
      /** Тип среды */ 
      TypeFluid: 2, 
      /** Параметер */ 
      TypeParameter: 3, 
      /** Температура */ 
      Temperature: 4 
     } 
    }, 

    lines: false, 
    rootVisible: false, 
    useArrows: true, 
    enableColumnHide: false, 
    enableColumnResize: false, 
    sortableColumns: false, 

    border: true, 

    viewConfig: { 
     cls: 'gridActionColumnHide' 
    }, 

    dockedItems: [ 
     { 
      xtype: 'toolbar', 
      dock: 'bottom', 
      ui: 'footer', 
      cls: 'transparent', 
      layout: { 
       type: 'hbox', 
       align: 'middle', 
       pack: 'center' 
      }, 
      items: [ 
       { 
        xtype: 'button', 
        cls: 'pvt-chart-button', 
        text: '', // локализация в initComponent 
        flex: 2, 
        name: 'addSample', 
        margin: 2 
       }, 
       { 
        xtype: 'button', 
        cls: 'pvt-chart-button', 
        text: '', // локализация в initComponent 
        flex: 1, 
        name: 'import', 
        disabled: true, 
        margin: 2 
       }, 
       { 
        xtype: 'button', 
        cls: 'pvt-chart-button', 
        text: '', // локализация в initComponent 
        flex: 1, 
        name: 'export', 
        disabled: true, 
        margin: 2 
       } 
      ] 
     } 
    ], 

    listeners: { 
     checkchange: 'nodeCheckChange', 
     edit: 'edit' 
    }, 
    plugins: { 
     ptype: 'cellediting', 
     clicksToEdit: 2 
    }, 

    bind: { 
     selection: '{selectedRecord}' 
    }, 

    initComponent: function() { 
     var me = this, 
      store = Ext.create('Ext.data.TreeStore', { 
       root: { 
        expanded: true, 
        children: [] 
       } 
      }), 
      controller = me.getController(); 

     me.dockedItems[0].items[0].text = me.locale.addSample; 
     me.dockedItems[0].items[1].text = me.locale.importText; 
     me.dockedItems[0].items[2].text = me.locale.exportText; 

     Ext.applyIf(me, { 
      store: store, 
      columns: [ 
       { 
        xtype: 'treecolumn', 
        dataIndex: 'text', 
        text: Poly.utils.locale.Base.localeName, 
        flex: 1, 
        getEditor: function (record) { 
         return me.getController().getEditor(record); 
        }, 
        renderer: function (value, meta, record) { 
         var depth = Poly.view.fluidProperties.sample.Tree.depth; 
         switch (record.getDepth()) { 
          case depth.Temperature: 
           if (Ext.isEmpty(record.get('temperature'))) { 
            return value; 
           } 
           var text = Ext.String.format('T = {0} {1}', 
            record.get('temperature').toFixed(2), 
            Poly.utils.UniSum.GetUnit(me.getViewModel().get('temperatureUnitId')).name); 

           return text; 
          case depth.TypeParameter: 
           if (record.get('isNew')) { 
            return value; 
           } 
           return Poly.enums.TypeFluidParameter.getName(record.get('fluidParameter'), record.parentNode.get('typeFluid'), true); 
         } 
         return value; 
        } 
       }, 
       { 
        width: 30, 
        xtype: 'widgetcolumn', 
        name: 'menuWidgetcolumn', 
        widget: { 
         xtype: 'button', 
         margin: '5 0 0 0', 
         arrowCls: '', 
         width: 15, 
         height: 15, 
         style: { 
          'background-color': '000000', 
          'border-color': '000000' 
         }, 
         menu: { 
          xtype: 'colormenu', 
          listeners: { 
           select: function (component, color) { 
            var button = component.up('button'); 

            button.setStyle('background-color', color); 
           } 
          } 
         } 
        }, 
        onWidgetAttach: function (column, widget, record) { 
         widget.setVisible(Ext.isNumber(record.get('temperature'))); 
        } 
       }, 
       { 
        xtype: 'actioncolumn', 
        width: 25, 
        items: [ 
         { 
          handler: 'removeTreeItem', 
          getClass: function (v, meta, rec) { 
           if (!rec.get('isNew')) { 
            return 'poly-trash-icon'; 
           } 
           return ''; 
          }, 
          getTip: function (v, meta, rec) { 
           if (!rec.get('isNew')) { 
            return 'Delete'; 
           } 
           return ''; 
          } 
         } 
        ] 
       } 
      ] 
     }); 

     me.getSampleNode = controller.getSampleNode; 
     me.setTypeMode = Ext.bind(controller.setTypeMode, controller); 

     me.callParent(arguments); 
    } 
}); 
+0

你不能,文本字段不要呈現html。 –

+0

@EvanTrimboli嗯,也許我可以把'按鈕'裏面?那可以工作嗎? – DanilGholtsman

+0

[EXTJS 4呈現組合框中選定值的HTML的可能副本](http://stackoverflow.com/questions/9016859/extjs-4-render-html-of-a-selected-value-in-a-組合框) – Tyr

回答

2

Html輸入元素無法顯示HTML,因此您需要更改模板添加div。 Div可以顯示爲覆蓋輸入。實現這一

最好的辦法是通過擴展組合框:

Ext.define('HtmlComboBox', { 
    extend: 'Ext.form.field.ComboBox', 
    fieldSubTpl: [ // note: {id} here is really {inputId}, but {cmpId} is available 
     '<input id="{id}" data-ref="inputEl" type="{type}" {inputAttrTpl}', 
      ' size="1"', // allows inputs to fully respect CSS widths across all browsers 
      '<tpl if="name"> name="{name}"</tpl>', 
      '<tpl if="value"> value="{[Ext.util.Format.htmlEncode(values.value)]}"</tpl>', 
      '<tpl if="placeholder"> placeholder="{placeholder}"</tpl>', 
      '{%if (values.maxLength !== undefined){%} maxlength="{maxLength}"{%}%}', 
      '<tpl if="readOnly"> readonly="readonly"</tpl>', 
      '<tpl if="disabled"> disabled="disabled"</tpl>', 
      '<tpl if="tabIdx != null"> tabindex="{tabIdx}"</tpl>', 
      '<tpl if="fieldStyle"> style="{fieldStyle}"</tpl>', 
      '<tpl foreach="inputElAriaAttributes"> {$}="{.}"</tpl>', 
     ' class="{fieldCls} {typeCls} {typeCls}-{ui} {editableCls} {inputCls}" autocomplete="off"/>', 
     // overlay element to show formatted value 
     '<div id="{cmpId}-overlayEl" data-ref="overlayEl"<tpl if="name"> name="{name}-overlayEl"</tpl> class="{fieldCls}-overlay {typeCls} {typeCls}-{ui} {inputCls}">{value}</div>', 
     { 
      disableFormats: true 
     } 
    ], 
    forceSelection: true, 

    childEls: [ 
     'overlayEl' 
    ], 

    setRawValue: function(value) { 
     var me = this; 

     // set value in overlay 
     if (me.rendered) { 
      me.overlayEl.update(value); 
     } 
     return me.callParent([value]); 
    } 
}); 

就這樣,需要一些額外的CSS:

.x-form-text-wrap { 
    position: relative; 
} 

.x-form-field-overlay { 
    background-color: #ffffff; 
    position: absolute; 
    top: 0; 
} 

小提琴:https://fiddle.sencha.com/#fiddle/14mm

+0

哇,非常感謝!你是怎麼做到這裏做的?是否有關於如何在extjs中使用tpls的其他信息? – DanilGholtsman

+0

你有可用的來源,這是你可以得到的最好的信息。 – Krzysztof

+0

嗯,thx,發現問題在這裏 - 模糊事件似乎工作,但沒有改變任何東西 – DanilGholtsman

1

我想你的編輯器是combo,默認情況下combo(以及許多其他組件)以純文本的形式顯示HTML。

Example

我想作爲變通方法,你可以<input>元件overrite combo(或任何其它部件),即變化分量<div>。它會引起一些方法的過度(例如setValue())。