UNPKG

ractive

Version:

Next-generation DOM manipulation

244 lines (238 loc) 18 kB
Changelog --------- * 0.5.0 * Code organisation * Codebase is now structured as ES6 modules, which can use new ES6 features such as arrow functions * Simpler, more efficient runloop * Encapsulated viewmodel logic * Breaking changes: * errors in observers and evaluators are no longer caught * Nodes are detached as soon as any outro transitions are complete (if any), rather than when *all* transitions are complete * The options argument of `init: function(options)` is now strictly what was passed into the constructor, use `this.option` to access configured value. * `data` with properties on prototype are no longer cloned when accessed. `data` from "baseClass" is no longer deconstructed and copied. * Use of a `<script>` tag for specifying inline templates is not enforced. * Options specified on component constructors will not be picked up as defaults. `debug` now on `defaults`, not constructor * Select bindings follow general browser rules for choosing options. Disabled options have no value. * Input values are not coerced to numbers, unless input type is `number` or `range` * `{{this.foo}}` in templates now means same thing as `{{.foo}}` * Rendering to an element already render by Ractive causes that element to be torn down (unless appending). * Illegal javascript no longer allowed by parser in expressions and will throw * Parsed template format changed to specify template spec version. * Proxy-event representation * Non-dynamic (bound) fragments of html are no longer stored as single string * See https://github.com/ractivejs/template-spec for current spec. * Arrays being observed via `array.*` no longer send `item.length` event on mutation changes * Reserved event names in templates ('change', 'reset', 'teardown', 'update') will cause the parser to throw an error * `{{else}}` support in both handlebars-style blocks and regular mustache conditional blocks, but is now a restricted keyword that cannot be used as a regular reference * Child components are created in data order * Keypath expressions resolve left to right and follow same logic as regular mustache references (bind to root, not context, if left-most part is unresolved). * Improved attribute parsing and handling: * character escaping and whitespace handling in attribute directive arguments * boolean and empty string attributes * Other new features * Better errors and debugging info * Duplicate, repetitive console.warn messages are not repeated. * Improved error handling and line numbers for parsing * Warn on bad two-way radio bindings * Support for handlebars style blocks: `#if`, `#with`, `#each`, `#unless` and corresponding `@index` and `@key` * Array mutation methods are now also available as methods on `Ractive.prototype` - e.g. `ractive.push('items', newItem)`. The return value is a Promise that fulfils when any transitions complete * Support for static mustache delimiters that do one-time binding * `{{./foo}}` added as alias for `{{.foo}}` * Leading `~/` keypath specifier, eg `{{~/foo}}`, for accessing root data context in keypaths * Observers with wildcards now receive actual wildcard values as additional arguments * The following plugins: adaptors, components, decorators, easing, events, interpolators, partials, transitions, when used in components will be looked up in the view hierarchy if they cannot be found in the inheritance chain. * `ractive.set` supports pattern observers, eg `ractive.set('foo.*.bar')` * Support for specifying multiple events in single `on`, eg `ractive.on( 'foo bar baz', handleFooBarOrBaz )` * Unnecessary leading and trailing whitespace in templates is removed * Better support for post-init render/insert * Computed properties can be updated with `ractive.update(property)` * `updateModel` returns a `Promise` * Media queries work correctly in encapsulated component CSS * `Component.extend` is writable (can be extended) * `append` option can now take a target element, behavior same as `ractive.insert` * All configuration options, except plugin registries, can be specified on `Ractive.defaults` and `Component.defaults` * Any configuration option except registries and computed properties can be specfied using a function that returns a value * `ractive.reset()` will re-render if template or partial specified by a function changes its value * New `ractive.resetTemplate()` method that re-renders with new template * Value of key/value pair for partials and components can be specified using a function * `ractive.off()` returns instance making it chainable * Improved support for extending Components with Components * Bug fixes: * Component names not restricted by array method name conflicts * Ensure all change operations update DOM synchronously * Unrooted and unresolved keypath expression work correctly * Uppercase tag names bind correctly * Falsey values in directives (`0`,`''`, `false`, etc) * IE8 fixes and working test suite * Keypath expressions in binding attributes * Edge case for keypath expression that include regular expression * Input blur correctly updates model AND view * Component parameters data correctly sync with parents * Correct components.json format * Variety of edge cases with rebindings caused by array mutations * Partials aware of parent context * `foreignObject` correctly defaults to HTML namespace * Edge cases with bind, rebind, unrender in Triples * Sections (blocks) in attributes * Remove unncessary evaluator function calls * Incorrect "Computed properties without setters are read-only in the current version" error * Handle emulated touch events for nodes that are defined on `window` in the browser * Never initialiased decorators being torndown * File inputs without mustache refs are not bound * Pattern observers with empty array * Callbacks that throw cause promise reject * Clean-up `input` and `option` binding edge cases * Using `this._super` safe if baseclass or it's method doesn't actually exist. * Leading `.` on keypaths do not throw errors and are removed for purposes of processing * Post-blur validation via observer works correctly * Radio buttons with static attributes work correctly * DOCTYPE declarations are uppercased * Transitioned elements not detaching if window is not active * CSS transitions apply correctly * wildcard `*` can be used as first part of observer keypath * 0.4.0 * BREAKING: Filenames are now lowercase. May affect you if you use Browserify etc. * BREAKING: `set()`, `update()`, `teardown()`, `animate()`, `merge()`, `add()`, `subtract()`, and `toggle()` methods return a Promise that fulfils asynchronously when any resulting transitions have completed * BREAKING: Elements are detached when *all* transitions are complete for a given instance, not just transitions on descendant nodes * BREAKING: Default options are placed on `Ractive.defaults` (and `Component.defaults`, where `Component = Ractive.extend(...)`) * BREAKING: The `adaptors` option is now `adapt`. It can be a string rather than an array if you're only using one adaptor * Reactive computed properties * Two-way binding works with 'keypath expressions' such as `{{foo[bar]}}` * Support for single-file component imports via loader plugins such as http://ractivejs.github.io/ractive-load/ * A global runloop handles change propagation and other batchable operations, resulting in performance improvements across the board * Promises are used internally, and exposed as `Ractive.Promise` (Promises/A+ compliant, a la ES6 Promises) * Components can have encapsulated styles, passed in as the `css` option (disable with `noCssTransform: true`) * `ractive.reset()` method allows you to replace an instance's `data` object * Decorators are updated when their arguments change (with specified `update()` method if possible, otherwise by tearing down and reinitialising) * Inline components inherit surrounding data context, unless defined with `isolated: true` * Transitions will use JavaScript timers if CSS transitions are unavailable * A global variable (`window.Ractive`) is always exported, but `Ractive.noConflict()` is provided to prevent clobbering existing `Ractive` variable * Inline component `init()` methods are only called once the component has entered the DOM * Any section can be closed with `{{/...}}`, where `...` can be any string other than the closing delimiter * Evaluators that throw exceptions will print an error to the console in debug mode * `ractive.observe(callback)` - i.e. with no keypath - observes everything * `ractive.observe('foo bar baz', callback)` will observe all three keypaths (passed to callback as third argument) * Better whitespace preservation and indenting when using `ractive.toHTML()` * Calling `ractive.off()` with no arguments removes all event listeners * Triples work inside SVG elements * `<option>{{foo}}</option>` works the same as `<option value='{{foo}}'>{{foo}}</option>` * More robust data/event propagation between components * More robust magic mode * Fixed a host of edge case bugs relating to array mutations * Many minor fixes and tweaks: #349, #351, #353, #369, #370, #376, #377, #390, #391, #393, #398, #401, #406, #412, #425, #433, #434, #439, #441, #442, #446, #451, #460, #462, #464, #465, #467, #479, #480, #483, #486, #520, #530, #536, #553, #556 * 0.3.9 * `ractive.findComponent()` and `ractive.findAllComponents()` methods, for getting references to components * Expression results are wrapped if necessary (e.g. `{{getJSON(url)}}` wrapped by [@lluchs](https://github.com/lluchs)' [Promise adaptor](lluchs.github.io/Ractive-adaptors-Promise/)) * Mustaches referring to wrapped values render the facade, not the value * Directive arguments are parsed more reliably * Components inherit adaptors from their parents * Adapto * Changes to [transitions API](http://docs.ractivejs.org/latest/transitions) * SVG support is detected and exposed as `Ractive.svg` * If subclass has data, it is used as prototype for instance data * 0.3.8 * Reorganised project into AMD modules, using [amdclean](https://github.com/gfranko/amdclean) during build * [Decorators](http://docs.ractivejs.org/latest/decorators) - decorate elements with functionality, e.g. tooltips, jQuery UI widgets, etc * Moved plugins (adaptors, decorators, custom events, transitions) out of the main codebase and into [separate repositories](https://github.com/RactiveJS/Ractive/wiki/Plugins). Note: [plugin APIs](http://docs.ractivejs.org/latest/plugin-apis) have changed! * [`ractive.merge()`](http://docs.ractivejs.org/latest/ractive-merge) - merge items from one array into another (e.g. updating with data from a server) * Pattern observers - observe e.g. `items[*].status` * Contenteditable support (thanks [@aphitiel](https://github.com/aphitiel) and [@Nijikokun](https://github.com/Nijikokun)) * `ractive.insert()` and `ractive.detach()` methods for moving a Ractive instance in and out of the DOM without destroying it * `ractive.toHTML()` replaces `ractive.renderHTML()` * `ractive.findAll( selector, { live: true })` maintains a live list of elements matching any CSS selector * Various bugfixes * 0.3.7 * [Adaptors](http://docs.ractivejs.org/latest/adaptors) - use external libraries like Backbone seamlessly with Ractive * Dependency tracking within functions, by monitoring `ractive.get()`) * Create live nodelists with the [`findAll()`](http://docs.ractivejs.org/latest/ractive-findall) method * Observers are guaranteed to fire before DOM updates, unless `{defer:true}` is passed as an option to [`ractive.observe()`](http://docs.ractivejs.org/latest/ractive-observe) * Triples behave correctly inside table elements etc (issue #167) * Delimiters ('{{' and '}}') can be overridden globally with `Ractive.delimiters` and `Ractive.tripleDelimiters` * Fix #130 (event handler parameters and array modification) * Tap event respects spacebar keypresses while a suitable element is focused * updateModel() method to resync two-way bindings if they are manipulated external (e.g. `$(input).val(newValue)`) * Better handling of HTML entities * Expressions with unresolved references will still render, using `undefined` in place of unknown references * Hover event fires on the equivalent of mouseenter/mouseleave rather than mouseover/mouseout * Various bugfixes and stability/performance improvements * 0.3.6 * Better two-way binding - support for multiple checkboxes and file inputs * Experimental 'magic mode' - use ES5 getters and setters instead of .set() and .get(). See [#110](https://github.com/RactiveJS/Ractive/issues/110) * More efficient event binding, and dynamic proxy event names * Support for pointer events with `tap` - thanks [lluchs](https://github.com/lluchs) * Iterate through properties of an object - see [#115](https://github.com/RactiveJS/Ractive/issues/115) * Bugfixes and refactoring * 0.3.5 * Experimental support for components - see [this thread](https://github.com/RactiveJS/Ractive/issues/74) for details * Support for [component](https://github.com/component/component) - thanks [CamShaft](https://github.com/CamShaft) * Option to use `on-click` style event binding (as opposed to `proxy-click`) * Bug fixes * 0.3.4 * `ractive.find()` and `ractive.findAll()` convenience methods (equivalent to `ractive.el.querySelector()` and `ractive.el.querySelectorAll()`) * Subclasses created with `Ractive.extend()` can now have a `beforeInit` method that will be called before rendering * Expressions no longer need to be wrapped in parentheses. Section closing mustaches for expression sections can have any content * Various minor bugfixes and improvements * 0.3.3 * Maintenance and bugfixes * 0.3.2 * IE8 support! * 0.3.1 * Transitions - fine-grained control over how elements are rendered and torn down * Inline partials * ractive.observe() method * Smart updates when using array mutator methods, reducing the amount of DOM manipulation that happens * Changed proxy event and event definition API (BREAKING CHANGE!) * Improved Ractive.extend * SVG elements no longer require the xmlns='http://www.w3.org/2000/svg' attribute - it is assumed, as it is in browsers * ractive.animate() can accept a map of keypaths to values * fullscreen convenience methods * removed ractive.render() method * added ractive.renderHTML() method, for rendering template+data (in browser or server environment) * 0.3.0 * Major overhaul, particularly of the parser * Expressions - JS-like expressions within templates, with robust tracking of multiple dependencies. These replace formatters * Renamed Ractive.compile -> Ractive.parse * Added adaptors (e.g. Backbone Model adaptors) * Various performance enhancements and bug fixes * 0.2.2 * Added event proxies. In lieu of documentation, for now, see [#27](https://github.com/RactiveJS/Ractive/issues/27) * Made array modification more robust and performant * 0.2.1 * Cleaned up some redundant code following 0.2.0 overhaul, some minor performance benefits * Linting and refactoring * Fixed bug where Ractive would attempt to use innerHTML with non-HTML elements (i.e. SVG text) * 0.2.0 * Major architectural overhaul. Data is now stored on the Ractive instance rather than on a separate viewmodel, allowing for cleaner and more efficient code (at the cost of the ability to share one viewmodel among many instances - a theoretical benefit at best). Data is flattened and cached, permitting lightning-fast lookups even with complex data. * Templates can be sanitized at compile-time to remove script tags and other hypothetical security risks. In lieu of documentation see issue #12 * 0.1.9 * More complete compliance with mustache test suite * More efficient compilation (consecutive text nodes are concatenated, etc) * Cleaned up public API, internal functions now kept private * `.animate()` now interpolates between arrays, and between objects * Complex element attributes wait until the end of a `.set()` cycle to update, to avoid repeatedly modifying the DOM unnecessarily * Element property names are used instead of attributes wherever possible (e.g. we use `node.className='...'` instead of `node.setAttribute('class','...')` internally) * Various bug fixes * 0.1.8 * Now using DOM fragments for better performance * Better support for legacy browsers * Vastly better two-way data binding * set() and get() now accept arrays of keys, for edge cases involving keys with periods * Bug fixes and refactoring * 0.1.7 * Renamed project from Anglebars to Ractive * Added support for animation * A shed-load of bug fixes, and a big dollop of refactoring * 0.1.6 * Bug fixes! * Modify arrays so that `pop`, `push` and other mutator methods trigger a view update * Removed half-finished, flaky async code. Async mode may return later * `set` events are called when a) `view.set()` is called, b) twoway bindings trigger them, c) array mutator methods cause an update * 0.1.5 * Split into Anglebars.compile and Anglebars.runtime, to shave a few kilobytes off in production * Simplified API - removed `compiled` and `compiledPartials` init options (in favour of allowing either compiled or string templates), and removed `observe` and `unobserve` instance methods * Added event methods - `on`, `off` and `fire` * `Anglebars.extend` for creating subclasses with default options (e.g. templates) and additional methods * Support passing in jQuery collections (and lookalikes), and CSS selectors (if browser supports `document.querySelector`) * Index references - `{{#section:i}}<!-- {{i}} evaluates to array index inside here -->{{/section}}` * 0.1.4 * started maintaining a changelog...