コード例 #1
0
ファイル: index.js プロジェクト: avetisk/ak-view
  it('should delegate dom events', function (done) {
    var counter = {
      'click': 0,
      'focus': 0,
      'bis': 0,
      'self': 0
    };
    var tpl = template('<div class="just-a-template"><div class="l-1"><input class="l-2" value="focus" /></div><div class="l-1-bis"><input class="l-2" value="click" /></div></div>');
    var view = new View({
      'template': tpl,
      'eventsContext': {'x': 1},
      'domEvents': {
        '': {
          'click': function (e) {
            e.type === 'click' && e.target === view.el && (counter.self += 1);
            counter.click === 1 &&
            counter.focus === 1 &&
            counter.bis === 1 &&
            counter.self === 1 &&
            this.x === 1 &&
            done();
          }
        },
        '.l-2': {
          'click, focus': function (e) {
            if (e.type === 'click' && e.target.value === 'click') {
              counter.click += 1;
            } else if (e.type === 'focus' && e.target.value === 'focus') {
              counter.focus += 1;
            } else {
              throw new Error('Delegate does not work properly.');
            }
          }
        },
        '.l-1-bis': {
          'click': function (e) {
            if (e.type === 'click' && e.target.className === 'l-2') {
              counter.bis += 1;
            }
          }
        }
      }
    });
    view.render();

    // NOTE DOM events work only in document tree
    document.body.appendChild(view.el);

    view.el.querySelector('.l-1-bis .l-2').click();

    // TODO use `input.focus();` when retarded Firefox & IE will handle it properly)
    var e = document.createEvent('HTMLEvents');
    e.initEvent('focus', true, true);
    view.el.querySelector('.l-1 .l-2').dispatchEvent(e);

    // click view.el
    view.el.click();
  });
コード例 #2
0
ファイル: index.js プロジェクト: avetisk/ak-view
  it('#render() with instance template', function (done) {
    var tpl = template('<div class="just-a-template"><%= locals.hari %></div><div class="never">Bad</div>');
    var view = new View({'template': tpl});
    view.render({'hari': 'Hari Bol !'});

    assert.equal(view.el.className, 'just-a-template');
    assert.equal(view.el.nextSibling, null);

    done();
  });
コード例 #3
0
ファイル: index.js プロジェクト: avetisk/ak-view
  it('#render() with class template', function (done) {
    var tpl = template('<div class="just-a-template"><%= locals.hari %></div><div class="never">Bad</div>');
    View.defaultOptions.template = tpl;
    var view = new View();
    view.render({'hari': 'Hari Bol !'});

    assert.equal(view.el.className, 'just-a-template');
    assert.equal(view.el.nextSibling, null);

    delete View.template;

    done();
  });
コード例 #4
0
ファイル: index.js プロジェクト: avetisk/ak-view
  it('should be properly destroyed', function () {
    var counter = 0;
    var tpl = template('<div class="just-a-template kill-me"><span class="lool"><%= locals.hari %></span></div><div class="never">Bad</div>');
    var view = new View({
      'template': tpl,
      'domEvents': {
        '.lool': {
          'click, focus': function () {
            throw new Error('Undelegating DOM events not done.');
          }
        }
      }
    });
    view.render({'hari': 'Hari Bol !'});
    view.on('destroy', function () {
      counter += 1;
    });

    // NOTE DOM events work only in document tree
    document.body.appendChild(view.el);

    var span = document.querySelector('.just-a-template.kill-me span');

    view.destroy();
    span.click();

    assert.equal(document.querySelector('.just-a-template.kill-me span'), null);
    assert(view.el === undefined);

    var view2 = new View({'template': tpl});
    view2.render({'hari': 'Hari Bol !'});

    assert(view2.el instanceof HTMLElement);
    view2.destroy();
    assert(view2.el === undefined);

    assert(counter === 1);
  });
コード例 #5
0
'use strict';

let fs = require('fs');
let path = require('path');
let template = require('ak-template');

const view = template(fs.readFileSync(path.join(__dirname, 'template.tpl'), 'utf-8'));

//Step 1: Create a function that declares what the DOM should look like
const render = count => {
  return view({count});
};

//Step 2: Initialise the document
//We need some app data. Here we just store a count.
//We need an initial tree
let count = 0;
let tree = render(count);

document.body.innerHTML = tree;

//Step 3: Wire up the update logic
setInterval(() => {
  count ++;

  const newTree = render(count);

  document.body.innerHTML = newTree;
}, 1000);