Search code examples
javascripttemplatesextjssencha-touch

sencha / javascript - how to call a function from inside a tpl template


I'm using Sencha touch and I'm trying to modify a twitter example I found online in order to turn urls from a twitter feed into clickable links. I saw that one of the examples in the sencha touch library uses a linkify feature, but I can't figure out how to incorporate it into my own project. Here's my code:

t_news = new Ext.Component({
        cls:'t_news',
        title:'News',
        scroll: 'vertical',
        tpl: [
            '<tpl for=".">',
                '<div class="tweet">',
                        '<div class="avatar"><img src="{profile_image_url}" /></div>',
                        '<div class="tweet-content">',
                            '<h2>{from_user}</h2>',
                            '<p>{text:this.linkify}</p>',
                        '</div>',
                '</div>',
            '</tpl>',
        ]
    });

function linkify(value){
        return value.replace(/(http:\/\/[^\s]*)/g, "<a target=\"_blank\" href=\"$1\">$1</a>");
    }

and here's the error:

Uncaught TypeError: Object [object Object] has no method 'linkify'

Solution

  • If you declare your XTemplate explicitly you can use the last constructor parameter which accepts a configuration object where you can specify template functions. These functions can be called with the value:function syntax.

    Your code will become:

    t_news = new Ext.Component({
    cls:'t_news',
    title:'News',
    scroll: 'vertical',
    tpl: new Ext.XTemplate(
        '<tpl for=".">',
            '<div class="tweet">',
                    '<div class="avatar"><img src="{profile_image_url}" /></div>',
                    '<div class="tweet-content">',
                        '<h2>{from_user}</h2>',
                        '<p>{text:this.linkify}</p>',
                    '</div>',
            '</div>',
        '</tpl>',
        {
            linkify: function(value){
                return value.replace(/(http:\/\/[^\s]*)/g, "$1");
            }
        })
    });
    

    These functions are executed in the scope of the XTemplate and can also be called within tpl tags or in the square bracket notation:

    '<tpl if="this.linkify(values.text) == \'some text\'">',
    '</tpl>'
    
    '<p>{[this.linkify(values.text)]}</p>'