web-dev-qa-db-ja.com

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 ...;
  }

 }
)
33
Snowright

XTemplate constructor APIドキュメントをご覧ください。良い例がたくさんあります。引用:

{[...]}の間にあるものはすべて、テンプレートのスコープ内で実行されるコードと見なされます。

したがって、次のようなことができるはずです。

'<img src={[this.getThumbUrl(rawThumbUrl)]} />',
57
Brian Moeskau

スコープで定義された関数を呼び出すには、次の構文を使用する必要があります。

{[this.functionName(values.valueName)]}

あなたの場合、あなたは電話することができます:

'<img src="{[this.getThumbUrl(values.rawThumbUrl)]}"/>',

テンプレートコンテキストの外部で定義された関数を使用する場合は、this.関数呼び出しから。

29
Matt

先日自分でこれを理解しようとしていましたが、クリックイベントを機能させるためのソリューションに出会いました。簡単な答えは、.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}&nbsp;{street}',
            '</a>',
            '<p>Owners:&nbsp;{owners}',
            '<br/>Flag Code:&nbsp;{flag}',
            '<br/>Number of Violations:&nbsp;[{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');})
    }
});

ソース

14
CoreyLoose

次のいずれかを実行できます。

  • 値を直接参照します(例: _{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>_
0
Mr. Polywhirl