2012-12-20 41 views
1

我试图避免冗余,并调用通用XTemplate格式化时间戳中的日期和时间。ExtJS XTemplates:从另一个模板调用模板

这不会输出我期望的字符串,只是UI中的[Object object]。

SCB.RMWB.templates = { 
    timeStamp: function(stamp) { 
     return new Ext.XTemplate( 
      '<span class="time-frame">{[ this.dateRangeMsg(stamp) ]}</span>', 
      { 
       dateRangeMsg: function(stamp) { 

        console.log('stamp', stamp);  

        var dateTime = new Date(), 
         now = Ext.Date.format(dateTime, 'U'),   // gives us seconds since the UNIX Epoch from Ext.Date class 
         offset = Ext.Date.format(dateTime, 'Z'),  // gives us GMT offset from Ext.Date class 
         minutesAgo = (now - 300),      // 5 minutes ago 
         hourAgo = (now - 3600),       // one hour ago 
         msg = ''; 


        if (stamp >= minutesAgo && stamp <= now) { 
         msg = 'Moments ago'; 
        } else if (stamp >= hourAgo && stamp <= now){ 
         msg = '1 hour ago'; 
        } else { 
         msg = this.formatGMT(stamp, offset).toString(); 
        } 

        return msg; 

       }, 
       formatGMT: function(stamp, offset){ 

        var time; 

        // * 1000 gives us date string to format in Ext.Date class 
        if (offset > 0){ 
         time = new Date((stamp - offset) * 1000);  
        } else { 
         time = new Date((stamp + offset) * 1000); 
        } 

        return Ext.Date.format(time, 'd-M-y, H:i \\G\\M\\T'); 

       }     
      } 
     ); 
    }, 
    notifications: { 
     flyout: function(){ 
      return new Ext.XTemplate(
       '<tpl for=".">',  
        '<li id="notification-flyout-{id}">', 
         '<div class="data-details">', 
          '<p>{message}</p>', 
          '{[ this.renderTimeStamp(values.sentDate) ]}', 
         '</div>', 
        '</li>', 
       '</tpl>', 
       { 
        renderTimeStamp: function(stamp) { 
         return SCB.RMWB.templates.timeStamp(stamp); 
        }    
       } 
      ); 
     } 
    } 
}; 

如果我继续时间戳功能,在原始模板它工作正常,但是这个功能将在不同的模板几个地方使用,所以我想更多的东西通用的,我可以重新使用。

+1

就分别定义了两个函数和引用它们作为你的模板定义方法。或者做'SCB.RMWB.templates.timeStamp.call(this,stamp)' - 你需要有正确的上下文。 – katspaugh

回答

2

嗯,我的代码示例中有一些难点需要关注,但在您的模板实例上调用apply时,它应该适用于您。

详细:

创建要一个辅助命名空间内重复使用一次的模板。为了重用它,提供了一个获取该实例以及提供的数据的方法。

var tpl = new Ext.Template('Name: {name}, Age: {age}'); 
tpl.apply({name: 'John', age: 25}); // returns a html string 

这里,(更详细)JSFiddle

相关问题