Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Cookbook: Continuous Redrawing of Views</title>
</head>
<body>
  <script type="text/x-handlebars" id="interval">
    {{#if fullSecond}}
      {{nyan-start}}
    {{/if}}
    {{#if quarterSecond}}
      {{nyan-middle}}
    {{/if}}
    {{#if halfSecond}}
      {{nyan-end}}
    {{/if}}
    {{#if threeQuarterSecond}}
      {{nyan-middle}}
    {{/if}}
    <h3>You&apos;ve nyaned for {{digital-clock clock.pulse}} (h:m:s)</h3>
    {{render "comments"}}
  </script>
  <script type="text/x-handlebars" id="components/nyan-start">
<pre>     +      o     +              o
         +             o     +       +
   o           +
-------_,------,       +        o
-------_|   /\\_/\\
-------^|__( - .-)      o  +      +
-------  ""  ""
     +      o         o   +       o
         +         +
 o             o         o      o     +
</pre>
  </script>
  <script type="text/x-handlebars" id="components/nyan-middle">
<pre>     +      o     +              o
         +             o     +       +
   o           +
________-------_,------,        o
________-------_|   /\\_/\\
________-------^|__( - .-) +      +
________-------  ""  ""
     +      o         o   +       o
         +         +
 o             o         o      o     +
</pre>
  </script>
  <script type="text/x-handlebars" id="components/nyan-end">
<pre>     +      o     +              o
         +             o     +       +
   o           +
-------________-------_,------, o
-------________-------_|   /\\_/\\
-------________-------^|__( - .-) +
-------________-------  ""  ""
     +      o         o   +       o
         +         +
 o             o         o      o     +
</pre>
  </script>
  <script type="text/x-handlebars" id="comments">
    <form {{action "add" on="submit"}}>
      {{input value=comment}}
      <button>Add Comment</button>
    </form>
    <ul>
    {{#each item in this}}
      <li>{{item.comment}} ({{digital-clock item.seconds}})</li>
    {{/each}}
    </ul>
  </script>
  <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.js"></script>
  <script src="http://cdnjs.cloudflare.com/ajax/libs/handlebars.js/1.3.0/handlebars.js"></script>
  <script src="http://builds.emberjs.com/tags/v1.8.1/ember.js"></script>
</body>
</html>
 
(function (host) {
  var ClockService = Ember.Object.extend({
    pulse: Ember.computed.oneWay('_seconds').readOnly(),
    tick: function () {
      var clock = this;
      Ember.run.later(function () {
        var seconds = clock.get('_seconds');
        if (typeof seconds === 'number') {
          clock.set('_seconds', seconds + (1/4));
        }
      }, 250);
    }.observes('_seconds').on('init'),
    _seconds: 0
  });
  Ember.Application.initializer({
    name: 'clockServiceInitializer',
    initialize: function(container, application) {
      container.register('clock:service', ClockService);
      application.inject('controller:interval', 'clock', 'clock:service');
    }
  });
  Ember.Handlebars.registerBoundHelper('digital-clock', function(seconds) {
    var h = Math.floor(seconds / 3600);
    var m = Math.floor((seconds % 3600) / 60);
    var s = Math.floor(seconds % 60);
    var addZero = function (number) {
      return (number < 10) ? '0' + number : '' + number;
    };
    var formatHMS = function(h, m, s) {
      if (h > 0) {
        return '%@:%@:%@'.fmt(h, addZero(m), addZero(s));
      }
      return '%@:%@'.fmt(m, addZero(s));
    };
    return new Ember.Handlebars.SafeString(formatHMS(h, m, s));
  });
  var App = Ember.Application.create();
  App.Router.map(function () {
    this.route('interval');
  });
  App.IndexRoute = Ember.Route.extend({
    redirect: function () {
      this.transitionTo('interval');
    }
  });
  App.IntervalController = Ember.ObjectController.extend({
    secondsBinding: 'clock.pulse',
    fullSecond: function () {
      return (this.get('seconds') % 1 === 0);
    }.property('seconds'),
    quarterSecond: function () {
      return (this.get('seconds') % 1 === 1/4);
    }.property('seconds'),
    halfSecond: function () {
      return (this.get('seconds') % 1 === 1/2);
    }.property('seconds'),
    threeQuarterSecond: function () {
      return (this.get('seconds') % 1 === 3/4);
    }.property('seconds')
  });
  App.CommentItemController = Ember.ObjectController.extend({
    seconds: Ember.computed.oneWay('clock.pulse').readOnly()
  });
  App.CommentsController = Ember.ArrayController.extend({
    itemController: 'commentItem',
    comment: null,
    actions: {
      add: function () {
        this.addObject(Em.Object.create({
          comment: this.get('comment'),
          clock: ClockService.create()
        }));
        this.set('comment', null);
      }
    }
  });
  host.App = App;
}(window));
Output

This bin was created anonymously and its free preview time has expired (learn why). — Get a free unrestricted account

Dismiss x
public
Bin info
anonymouspro
0viewers