Вызвать функцию в ExtJS XTemplate
Я знаком с использованием функции для определения конкретного условия с использованием xtemplate, но не уверен, как напрямую вызвать функцию без условного оператора if.
Мой код, например, хочет добавить некоторые символы в строку, которую я использую в своей xtemplate. Я думаю, что лучший способ сделать это - добавить символы при рендеринге xtemplate.
var myTpl = new Ext.XTemplate(
'<tpl for=".">',
'<tpl if="this.isThumbnailed(thumbnailed) == true">',
'<img src=this.getThumbUrl(rawThumbUrl)/>', //this call to function does not work, also tried variations of this.
'</tpl>',
'</tpl>',
{
isThumbnailed : function(thumbnailed) {
return ...;
},
getThumbUrl : function(rawThumbUrl) {
//... //this function does not get called.
return ...;
}
}
)
Ответы
Ответ 1
Посмотрите на конструктор XTemplate API docs. Там есть много хороших примеров. Цитирование:
Все, что между {[...]} считается кодом, который должен выполняться в области шаблона.
Итак, вы должны иметь возможность сделать что-то вроде:
'<img src={[this.getThumbUrl(rawThumbUrl)]} />',
Ответ 2
Для вызова функций, определенных в области, вам необходимо использовать синтаксис:
{[this.functionName(values.valueName)]}
В вашем случае вы можете позвонить:
'<img src="{[this.getThumbUrl(values.rawThumbUrl)]}"/>',
Если вы хотите использовать функцию, определенную вне контекста шаблона, удалите this.
из вызова функции.
Ответ 3
Пытался понять это на днях и наткнулся на решение для работы с кликами. Короткий ответ: вам нужно использовать функцию .defer для настройки прослушивателей событий после визуализации шаблона.
Вот пример, который я нашел:
var resultTpl = new Ext.XTemplate(
'<tpl for=".">',
'<div class="search-item">',
'<a id={[this.getLinkId()]} href="violation.aspx?violationid={slvha}">',
'<img src="images/icons/home.gif" style="float:left;padding-right:2px">{number} {street}',
'</a>',
'<p>Owners: {owners}',
'<br/>Flag Code: {flag}',
'<br/>Number of Violations: [{summary}]</p>',
'</div>',
'</tpl>', {
getLinkId: function(values) {
var result = Ext.id();
this.addListener.defer(1, this, [result]);
return result;
},
addListener: function(id) {
Ext.get(id).on('click', function(e){e.stopEvent(); alert('link ' + id + ' clicked');})
}
});
Источник
Ответ 4
Вы можете:
- Ссылка на значение непосредственно, например.
{myValue}
- Передайте его функции, например.
{[this.myFunction(values.myValue)]}
.
Ниже приведен пример, который работает со всеми версиями ExtJS.
var data = [{
id: 1,
subdata: { x: 10, y: 20 }
}, {
id: 2,
subdata: { x: 20, y: 30 }
}];
var tpl = new Ext.XTemplate([
'<ul>',
'<tpl for=".">',
'<li>ID: <span class="raw">{id}</span> or ',
'<span class="fmt">{["#" + this.pad(values.id, 3, "0")]}</span></li>',
'<ul>',
'<tpl for="subdata">',
'<li>x: <span class="raw">{x}</span> or ',
'<span class="fmt">{[this.frmtUnits(values.x)]}</span></li>',
'<li>y: <span class="raw">{y}</span> or ',
'<span class="fmt">{[this.frmtUnits(values.y)]}</span></li>',
'</tpl>',
'</ul>',
'</tpl>',
'</ul>',
{
pad : function(s, n, c) {
if (typeof s !== 'string') s = '' + s;
return Math.abs(n) <= s.length ? s : this.pad(n > 0 ? c + s : s + c, n, c);
},
frmtUnits : function(v) {
return v + 'px';
}
}
]);
Ext.onReady(function () {
new Ext.Panel({
autoHeight: true,
html: tpl.apply(data),
layout: 'fit',
style: { padding: '2px', margin: '2px' },
renderTo: Ext.getBody()
});
});
ul li {
line-height: 1.67em;
}
li span {
font-weight: bold;
}
li span.raw {
color: #D44;
}
li span.fmt {
color: #44D;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/extjs/4.2.1/ext-all-debug.js"></script>