UNPKG

can-stache

Version:

Live binding handlebars templates

149 lines (125 loc) 3.04 kB
<!DOCTYPE HTML> <html> <head> <style> p { font: 12px/16px Arial; margin: 10px 10px 15px; } button { font: bold 14px/14px Arial; margin-left: 10px; } #grid { margin: 10px; } #timing { clear: both; padding-top: 10px; } .box-view { width: 20px; height: 20px; float: left; position: relative; margin: 8px; } .box { border-radius: 100px; width: 20px; height: 10px; padding: 5px 0; color: #fff; font: 10px/10px Arial; text-align: center; position: absolute; } </style> </head> <body> <button id='start'>Start</button> <button id='stop'>Stop</button> <div id='timing'></div> <script src="../node_modules/steal/steal.js" main="@empty"> var DefineMap = require("can-define/map/map"); var DefineList = require("can-define/list/list"); var stache = require("can-stache"); var batch = require("can-event/batch/batch"); var template = stache( "{{#each(boxes)}}" + "<div class='box-view'>" + "<div class='box' id='box-{{number}}' style='{{style}}'>" + "{{content}}" + "</div>" + "</div>" + "{{/each}}" ); var boxes = new DefineList(); var Box = DefineMap.extend({ number: {}, count: {value: 0}, top: {}, left: {}, color: {}, content: {}, style: {}, tick: function() { var count = this.count + 1; this.count = count; this.top = Math.sin(count / 10) * 10; this.left = Math.cos(count / 10) * 10; this.color = count % 255; this.content = count % 100; this.style = this.computeStyle(); }, computeStyle: function() { return 'top: ' + this.top + 'px; left: ' + this.left + 'px; background: rgb(0,0,' + this.color + ');'; } }); for(var i =0; i < 1000; i++) { var box = new Box({ number: i }); box.tick(); boxes.push( box ); } var now = new Date(); //console.profile("render"); var frag = template({boxes: boxes}); console.log("render", new Date() - now); //console.profileEnd("render"); var div = document.createElement("div") document.body.appendChild(div) div.appendChild(frag) var count = 0; var run = function(){ batch.start(); for(var n = 0; n < 100; n++) { boxes[n].tick(); } batch.stop(); }; document.getElementById("start").addEventListener("click", function(){ loopCount = 0; totalTime = 0; //console.profile("loops"); benchmarkLoop(run); }); window.timeout = null; window.totalTime = null; window.loopCount = null; window.benchmarkLoop = function(fn) { var startDate = new Date(); fn(); var endDate = new Date(); totalTime += endDate - startDate; loopCount++; if (loopCount % 100 === 0) { document.getElementById("timing").innerHTML = 'Performed ' + loopCount + ' iterations in ' + totalTime + ' ms (average ' + (totalTime / loopCount).toFixed(2) + ' ms per loop).'; } if(loopCount < 1000) { timeout = setTimeout(function(){ benchmarkLoop(fn); },1); } else { //console.profileEnd("loops"); } }; </script> </body> </html>