UNPKG

ractive

Version:

Next-generation DOM manipulation

222 lines (179 loc) 5.54 kB
define([ 'ractive' ], function ( Ractive ) { 'use strict'; return function () { var fixture = document.getElementById( 'qunit-fixture' ); module( 'ractive.reset()' ); test( 'Basic reset', function ( t ) { var ractive = new Ractive({ el: fixture, template: '{{one}}{{two}}{{three}}', data: { one: 1, two: 2, three: 3 } }); ractive.reset({ two: 4 }); t.htmlEqual( fixture.innerHTML, '4' ); }); test( 'Invalid arguments', function ( t ) { var ractive = new Ractive({ el: fixture, }); throws(function(){ ractive.reset("data"); }) //Assuming that data fn's are not allowed on reset //caller could just execute themselves: //ractive.reset(fn(), cb) //Otherwise introduces ambiguity... throws(function(){ ractive.reset(function(){}, function(){}); }) }); asyncTest( 'Callback and promise with reset', function ( t ) { var ractive, callback, counter, done; ractive = new Ractive({ el: fixture, template: '{{one}}{{two}}{{three}}', data: { one: 1, two: 2, three: 3 } }); counter = 2; done = function () { --counter || start(); }; callback = function(){ t.ok(true); done() }; expect(6) ractive.reset({ two: 4 }, callback); t.htmlEqual( fixture.innerHTML, '4' ); ractive.reset({ one: 9 }).then(callback); t.htmlEqual( fixture.innerHTML, '9' ); ractive.reset(callback); t.htmlEqual( fixture.innerHTML, '' ); }); asyncTest( 'Dynamic template functions are recalled on reset', function ( t ) { var ractive = new Ractive({ el: fixture, template: function ( d ) { return d.condition ? '{{foo}}' : '{{bar}}' }, data: { foo: 'fizz', bar: 'bizz', condition: true } }); t.htmlEqual( fixture.innerHTML, 'fizz' ); ractive.set('condition', false) ractive.reset(ractive.data).then( function () { t.htmlEqual( fixture.innerHTML, 'bizz' ); start(); }); }); asyncTest( 'Callback and promise with dynamic template functions are recalled on reset', function ( t ) { var ractive, callback, counter, done; ractive = new Ractive({ el: fixture, template: function ( d ) { return d.condition ? '{{foo}}' : '{{bar}}' }, data: { foo: 'fizz', bar: 'bizz', condition: true } }); counter = 2; done = function () { --counter || start(); }; callback = function(){ t.ok(true); done() }; expect(5); t.htmlEqual( fixture.innerHTML, 'fizz' ); ractive.set('condition', false) ractive.reset(ractive.data).then(callback); t.htmlEqual( fixture.innerHTML, 'bizz' ); ractive.set('condition', true) ractive.reset(ractive.data, callback); t.htmlEqual( fixture.innerHTML, 'fizz' ); }); test( 'resetTemplate rerenders with new template', function ( t ) { var ractive = new Ractive({ el: fixture, template: '{{foo}}', data: { foo: 'fizz', bar: 'bizz' } }); t.htmlEqual( fixture.innerHTML, 'fizz' ); ractive.resetTemplate('{{bar}}') t.htmlEqual( fixture.innerHTML, 'bizz' ); }); // Removed this functionality for now as not apparent // what purpose of calling resetTemplate() without rerender /* test( 'resetTemplate with no template change doesnt rerender', function ( t ) { var p, ractive = new Ractive({ el: fixture, template: '<p>{{foo}}</p>', data: { foo: 'fizz' } }); p = ractive.find('p'); t.htmlEqual( fixture.innerHTML, '<p>fizz</p>' ); ractive.resetTemplate('<p>{{foo}}</p>'); t.htmlEqual( fixture.innerHTML, '<p>fizz</p>' ); t.equal( ractive.find('p'), p); ractive.resetTemplate('<p>bar</p>'); t.htmlEqual( fixture.innerHTML, '<p>bar</p>' ); t.notEqual( ractive.find('p'), p); }); */ test( 'Reset retains parent default data (#572)', function ( t ) { var ractive, Widget; Widget = Ractive.extend({ data: { uppercase: function ( str ) { return str.toUpperCase(); } } }); ractive = new Widget({ el: fixture, template: '{{ uppercase(foo) }}', data: { foo: 'bar' } }); ractive.reset({ foo: 'bizz' }); t.htmlEqual( fixture.innerHTML, 'BIZZ' ); }); test( 'Reset inserts { target, anchor } el option correctly', function ( t ) { var ractive, target = document.createElement('div'), anchor = document.createElement('div'); anchor.innerHTML = 'bar'; target.id = 'target'; target.appendChild( anchor ); fixture.appendChild( target ); t.htmlEqual( fixture.innerHTML, '<div id="target"><div>bar</div></div>' ); ractive = new Ractive({ el: target, append: anchor, template: '<div>{{what}}</div>', data: { what: 'fizz' } }); t.htmlEqual( fixture.innerHTML, '<div id="target"><div>fizz</div><div>bar</div></div>' ); ractive.reset( { what: 'foo' } ); t.htmlEqual( fixture.innerHTML, '<div id="target"><div>foo</div><div>bar</div></div>' ); }); test( 'resetTemplate removes an inline component from the DOM (#928)', function ( t ) { var ractive = new Ractive({ el: fixture, template: '<widget type="{{type}}"/>', data: { type: 1 }, components: { widget: Ractive.extend({ template: function ( data ) { return data.type === 1 ? 'ONE' : 'TWO'; }, init: function () { this.observe( 'type', function ( type ) { this.resetTemplate( type === 1 ? 'ONE' : 'TWO' ); }, { init: false }); } }) } }); ractive.set( 'type', 2 ); t.htmlEqual( fixture.innerHTML, 'TWO' ); }); }; });