Commits on Nov 29, 2017
  1. Commit 90 (v0.9.90 - Beta)

    BorisMoore committed Nov 29, 2017
    Minor bug fixes:
    - Tags and converters with 'depends' as a function: the function now
      receives the tag as 'this' pointer and the contextual data object as
    - Fix for syntax error bug for debugMode(true) with {{else}} blocks
    - Fix for bug in advanced nested $.render() call scenarios (when
      useViews advanced setting is false):
    - linkedCtxParam bugs:
      - If linkedCtxParam="foo", and onUpdate is not false, two-way binding
        on ~foo continues to work correctly after an update
      - If linkedCtxParam="foo", 2 way binding now works correctly
        for properties of ~foo (
    - Fix for validation bug for 'preventInvalidData'. Now uses
      onBeforeUpdateValue rather than onBeforeChange
    Feature improvements and changes for custom tags:
    - Very minor breaking changes:
      - The (undocumented) onBeforeBind event has been removed
      - Signature change for tag.cvtArgs(): does not accept a converter
    - 'lateRender' is now available as a tag option (overridden by inline
    - 'trigger' is now available as a tag option (overridden by inline
    - 'linkedElement' and 'linkedCtxParam' can now be set in init()
    - Calling tag.updateValue() now updates both external bindings and internal
      content dependencies (which it updates by calling tag.setValue()...)
    - If a tag has no args, and argDefault is not set to false, then the
      tagCtx.args[] will be [#data] (where #data is the current data
       context). Note that the render() method will receive the current data
       as parameter. (See
    Unit tests:
    - Several additional unit tests
    - JsViews custom tag controls topic has been augmented. (More content to
      be added in next updates) See:
Commits on Oct 15, 2017
  1. Commit 89 (v0.9.89 - Beta)

    BorisMoore committed Oct 15, 2017
    BREAKING CHANGE: On custom tags, the boolean property to indicate
      inline tags is now 'tag.inline' instead of 'tag._.inline'
    Feature improvements:
    - Debug mode now  works at individual tag level (Breaking)
    - Two-way binding can now work with multiple args, by returning an
      array from convertBack {{cvt: arg1 arg2 ... :cvtBack}}
    - Can now use a convertBack converter which returns 'undefined', to
      make other changes/side effects
    - New feature - HTML element property as data-linking target
    - On custom tags with multiple bindTo targets: "bindTo: [...]", can now
      return an array from convert, to convert multiple bindTo targets,
      or a non-array to convert just arg[0]
    - The event sequence on tag.refresh() has been changed to: onUnbind,
      render, onBind, onAfterLink
    - Can now set "trigger:..." on custom tag. Overridden by declarative
      "trigger= on" on instance markup
    - A syntax error is now thrown for "target{:xxx:}"
      See: BorisMoore/jsrender#329 (comment)
    Bug fixes
    - Corrected double element change handler firing, (oninput and onkeydown)
    - Bug fix with data-linked {^{for}}{{else}} not removing rendered items
      See: #394
    Additional minor bug fixes:
    - Can now easily override default converters in jsrender
      See: BorisMoore/jsrender#327
    - Bug fix for scrolling issues on search feature of site
    - Bug fix for scoping of contextual parameters when doing "nested linking":
      See: #393
    - Other minor bug fixes
    Unit tests:
    - Several additional unit tests
    - New documentation section: JsViews custom tag controls
      (This is just the first installment. More content to be added in
      next updates)
    - Corrected documentation error, webpack jsrender without jQuery
    - Added documentation for observably removing element attributes
Commits on Aug 26, 2017
  1. Commit 88 (v0.9.88 - Beta)

    BorisMoore committed Aug 26, 2017
    Minor bug fixes and improvements. No breaking changes.
    Feature improvements:
    - Added support for 'mouse editing' of textboxes for browsers
      supporting HTML5 'oninput' event.
    Minor bug fix:
    - #388
    Unit tests:
    - Several additional unit tests
    - New documentation topics added for JsRender custom tags:
    - New documentation topics added for $.views object:
    - New documentation topics added for compiled template objects:
    - New documentation topics and samples added for using {{props}}
      to iterate over a top-level dictionary/hash data-collection:
    - Several improvements and bug fixes on site.
Commits on Jul 10, 2017
  1. Commit 87 (v0.9.87 - Beta)

    BorisMoore committed Jul 10, 2017
    Feature improvements:
    - Some improvements and minor bug fixes on lifecycle events
    Minor breaking change:
    - onBeforeChange event handler behavior has been simplified and
      improved. It is called only when a tag is being updated as a
      result of observable changes. It is no longer call when a tag
      with two-way binding is about to call updateValues(). In the
      latter scenario, a new onBeforeUpdateVal event is instead called.
    Bug fixes:
    - Several minor bug fixes
    Unit tests:
    - Several additional unit tests
    - New documentation added for view.ctxPrm() API:
Commits on Jun 17, 2017
  1. Commit 86 (v0.9.86 - Beta)

    BorisMoore committed Jun 17, 2017
    - tag.update() method renamed to tag.updateValue() (for consistency
      with tag.setValue() and new tag.updateValues() and tag.setValues()
      APIs - see below)
    - $.views.getCtx( API introduced in commit 80 has been
      removed. Use view.ctxPrm("foo") instead.
    Feature improvements:
    Many new and improved features, particularly related to custom tag
    scenarios, as shown below. Documentation to follow on each of these
    improvemnts to provide more information and specifics...
    - Contextual parameters now support 2-way data-binding:
      <input data-link="~foo" />
    - New APIs view.ctxPrm() and tag.ctxPrm():
      Programmatically get/set contextual parameters:
      var fooValue = view.ctxPrm("foo"); // Get value of ~foo
      view.ctxPrm("foo", newValue); // Set (update observably) value of ~foo
      var fooValue = tag.ctxPrm("foo"); // Get value of ~foo
      tag.ctxPrm("foo", newValue); // Set value of ~foo
    - tagCtx now has a tagCtx.contentView property, which is a view object
      wrapping the contents of the tag (or of the {{else}} block for the
      tag) - whether content rendered by the tag (using a tag render() method
      or template), or block content wrapped by the tag.
    - The APIS:
      tagCtx.nodes() and
      all return contents of the block - and are equivalent to:
      tagCtx.contentView.contents() etc.
      (And similarly for the APIs tag.contents(), tag.nodes() and
    - Improvements to APIs:
      tag.cvtArgs(), tagCtx.cvtArgs(), tag.bndArgs(), tagCtx.bndArgs()
    - Views have a new property: view.root, which provides access to the "root
      ancestor view" (the uppermost view under the top view).
    - Improvements to APIs:
      tag.setValue(), tag.setValues(), tag.updateValue(), tag.updateValues()
      and tagCtx.setValues(). (Details and documentation to follow).
    - Improvements to linkedElems APIS: linkedElems are now supported on tags
      with one or more {{else}} blocks. Each {{else} block can have its own
      linkedElem bindings.
    - New support for <input type="number"/>
    Bug fixes:
    - #380
      Support for <input type="number"/>
    - #382
      Cannot set property '_prv' of undefined
    - Several minor bug fixes
    Unit tests:
    - Several additional unit tests
Commits on Jun 15, 2017
  1. Updated README

    BorisMoore committed Jun 15, 2017
Commits on Apr 26, 2017
  1. fix README markdown

    gulping committed Apr 26, 2017
Commits on Apr 24, 2017
  1. Commit 85 (v0.9.85 - Beta)

    BorisMoore committed Apr 24, 2017
    Feature improvements:
    - Important update for jQuery UI widget-based tag controls library,
      Improvements to {{datepicker}} tag control. See new documentation:
      Improvements to {{spinner}} tag control. See new documentation:
      New {{timespinner}} control. See new documentation:
    Bug fixes:
    - #360
      Datepicker data binding and formatting
    - #369
      DataTable plugin scenario (cloned elements)
    - #373
      Radio buttons binding to integers
    - #374
      {{timespinner}} scenarios
    - BorisMoore/jsrender#317
      Defensive coding against corrupted jQuery cached template on element
    - Several minor bug fixes
    Minor breaking change:
    - Added "use strict" to all .js files. Can be breaking if files are
    Unit tests:
    - Several additional unit tests
Commits on Mar 9, 2017
  1. Commit 84 (v0.9.84 - Beta)

    BorisMoore committed Mar 9, 2017
    Feature improvements:
    - Major update for custom tags - including support for two-way binding to multiple
      args and props
      See samples:
      and tests:
      and also jQuery UI tag control samples such as
      Also many code examples in
      A tag definition can include:
        tag.bindTo - which specifies two-way bound parameters (one or more args and/or
        tag.linkedElement - which specifies selectors for linkedElems for any of the
          two-way bound parameters
        tag.linkedCtxParam - which specifies/names tag contextual parameters for any of
          the two-way bound parameters
        mainElement - which specifies selector for an element used for setting id, width
          or height (otherwise, linkedElem is used)
      A tag onBind event can set:
        tag.mainElem - which is the element used for setting id, width or height
          (otherwise, linkedElem is used)
        tag.displayElem - which is the element used for setting class (otherwise,
          mainElem/linkedElem is used)
      The following tag methods are available:
        tag.bndArgs() -  which returns array of 'external' bound parameters (after
          convert, if convert=... is specified)
        tag.update(...) - which observably updates any ('external') bound parameters
          (using convertBack, if specified)
        tag.setValue(...) - which sets tag itself to new ('internal') values of bound
        tag.getValue(...) - which returns array of current ('internal') values of bound
      New 'tag contextual parameters' feature - see samples and explanation: and
    - Other custom tag improvements:
      New 'tag boundProps' feature:
        Tag definition can include: tag.boundProps - which specifies any additional props
          that are bound, without needing ^myprop=... notation. See sample:

      New 'tag contentCtx' feature:
        Tag definition can include: tag.contentCtx - which specifies the data context within
          the tag block content.
        Set contentCtx = true for inheriting parentView context, or to a function, for
          specifying other context
      New 'tag argDefault' feature:
        Tag definition can include: tag.argDefault: false - which prevents the first arg
          defaulting to current data
      New 'tag onUpdate: false' feature:
        Tag definition can include: tag.onUpdate: false - which is equivalent to an onUpdate
          handler which does nothing but returns false, so tag does not rerender when bound
          args or props update
    - Major update for jQuery UI widget-based tag controls library:
      Extensive new jQueryUI widget controls support and accompanying samples/documentation:
    - New lateRender=true feature: set lateRender=true on any tag, to make the tag render only
      after completing the data-linking pass. Useful for using expressions such as
      #childTags('myTag') in data-link expressions.
      See tests:
      and sample:
    - {^{on ...}} with no content allows setting width, height, id and class
    Perf improvements for sorting, moving, refreshing:
    - Much improved perf for {^{for myArray}}...{{/for}} when making observable changes to
      underlying array. When using $.observable(myArray).refresh(...) or
      $.observable(myArray).move(...), the resulting changes to the rendered items no longer
      result in deleting and re-rendering the moved items. Instead the rendered HTML elements
      are simply moved to their new positions under the parent element.
    Bug fixes:
    - #361: Breaking change (radiobuttons) - both
      radiogroup and directly data-linked radio buttons now behave identically. Neither of
      them coerce value to string
    - Bug with setting tag.depends=... (Breaking change: Note that setting fn.depends="myArray"
      updates for array changes as well as prop change. See:
    - #354: Minor 'onError' bug
    - #360: Datepicker bug fix for correct behavior
      when data-linking to a value of type Date
    - Several minor bug fixes
    Unit tests:
    - Several additional unit tests
    Other minor breaking changes:
    - The undocumented lazyLink feature has been removed
    - The undocumented init: false feature for custom tags has been removed.
Commits on Nov 18, 2016
  1. Commit 83 (v0.9.83 - Beta)

    BorisMoore committed Nov 18, 2016
    Feature improvements:
    - New boundProps feature for custom tag controls. See sample here:
    - Minified files provided for all 'plugin libraries'
    - Updated download pages:
    - New sample for {{draggable}} and {{droppable}}:
    - New jQuery widget controls documentation topic:
    Bug fixes:
    - #351: Binding contextual parameters
    - #352: multiselect not showing initial selection
    - BorisMoore/jsrender#305 "Unknown template" error message with jQuery 3.0+
    - validate.js minor bugfix/improvement
    - Several minor bug fixes
    Unit tests:
    - Several additional unit tests
Commits on Oct 29, 2016
  1. Commit 82 (v0.9.82 - Beta)

    BorisMoore committed Oct 29, 2016
    Feature improvements:
    - New {^{radiogroup}} tag makes data-linked radio groups simpler
    - Improvements and bug fixes to jQuery UI based tag controls and to
    - New jQueryUI tag controls {{controlgroup}}, {{radio}} and {{checkbox}}
    - New tag.contentCtx() method allows custom tags to set the data context
      in wrapped blocks.
    - Improvements to validate.js
      {^{validate}} no longer depends on edit.js, which is no longer
      included with downloads.
    - Added {{else}} support on {{range}} (range.js)
    Breaking Change:
    - The edit.js file and the generic {{edit}} tag are no longer supported
      and no longer used as base tag for {{validate}}. The features of {{edit}}
      are now provided through the core jsviews.js code.
    - {{validate}} now has the same data context within block as outside
    - New documentation topics on {{radiogroup}}: and
    - New documentation and samples for custom get/set property on compiled
      View Model:
    - New 'Toolbar' sample using multiple jQuery UI tag controls:
    Bug fixes:
    - #349
    - Several minor bug fixes
    Unit tests:
    - Several additional unit tests
Commits on Oct 2, 2016
  1. Commit 81 (v0.9.81 - Beta)

    BorisMoore committed Oct 2, 2016
    Feature improvements:
    - Custom tag control improvements (documentation to follow soon):
      tag.linkedElement property
      onBind event
      onUnbind event
      onAfterLink signature: (tagCtx, linkCtx, tag.ctx, ev, eventArgs)
      Improvements to tag controls based on JQueryUI widgets (with updated
      jsviews-jqueryui-widgets.js providing support for jQuery UI 1.12.1, including
      new {{controlgroup}} and {{checkboxradio}} tag controls based on corresponding
    Breaking Change:
    - The undocumented onBeforeLink and onAfterBind events on custom tag controls
      have been removed
    - New documentation topic on data-linking using tag bindings:
    Bug fixes:
    - #346
    - Several minor bug fixes
    Unit tests:
    - Several additional unit tests
Commits on Jul 28, 2016
  1. Commit 80 (v0.9.80 - Beta)

    BorisMoore committed Jul 28, 2016
    Feature improvement:
    - References to contextual parameters are now data-bound - so for example:
        {^{for items ~foo=observableExpr}}
      the {^{:~foo}} above will update when observableExpr updates.
    - $.views.settings.delimiters(...) now also accepts an array such as
      ["<%", "%>"] - which might be the returned array from a previous call
      to $.views.settings.delimiters().
    Breaking Change:
    - If ~foo=observableExpr is a contextual parameter declared on a tag, then
      within the tag, will not return the current value, but
      rather, an array which enables the live binding feature above.
      As a result, in JsViews, to obtain the value of ~foo from the ctx object,
      it is now necessary to use the API: $.views.getCtx(
      (In JsRender, on the other hand, will also provide the
      value directly)
    Unit tests:
    - Several additional unit tests
    - Several new and improved documentation topics including several new topics
      under "Targets for data-linking" at
    Bug fixes:
    - #344
    - Several minor bug fixes
Commits on Jul 13, 2016
  1. Commit 79 (v0.9.79 - Beta)

    BorisMoore committed Jul 13, 2016
    - Several improvments to event binding using {^{on ...}} or data-link'"{on ...}"
    Unit tests
    - Several additional unit tests
    - New documentation topics:
      - Event binding (
      - The {^{on}} tag (
Commits on Jul 3, 2016
  1. Commit 78 (v0.9.78 - Beta)

    BorisMoore committed Jul 3, 2016
    Breaking changes:
    - The $.observable(array).insert(index, items) method, with index > arrayLength
      now appends, rather than being a noop.
    - $.observable(array).move(...) is now optimized - and no longer refreshes
      the whole array. (Instead it removes then inserts).
    - $.observable(array).refresh(...) is now optimized - and executes a series
      of add or remove operations, rather than re-rendering the whole array.
    - The merge(...) method for compiled View Models is now optimized - and can
      lead to major perf improvement (when specifying an id property or function
      for determining 'identity').
    - Several improvments to event binding using {^{on ...}} or data-link'"{on ...}"
      documentation to follow.
    Small bug fixes:
    - If the value for a data-linked attribute on an element is set to null or undefined
      then the attribute is removed #338.
    - Modifying the 'key' property within a {{props}}...{{/props}} block now
      renames the corresponding data property on the data (and no longer leaves
      the previously named property with the value null.
    - Some additional small bug fixes...
    - Sereral additional unit tests.
    Documentation and samples:
    - The jsonview tag control has been improved, and has a css stylesheet for
      much improved rendering. New sample available at:
    - Many new or improved documenation topics including: and several new topics under:
Commits on Jun 16, 2016
  1. Commit 77 (v0.9.77 - Beta)

    BorisMoore committed Jun 16, 2016
    - Breaking change: The default global setting for trigger is now true.
      So text boxes now trigger observable data updates on keydown (as you type)
      without needing to set <input data-link="xxx trigger=true"/>.
      To obtain the previous behavior (update on blur/change):
      - set trigger globally to false: $.views.settings.trigger(false)
      - or set to false on individual inputs: <input data-link="xxx trigger=false"/>.
    - Several minor bug fixes
    - New JsViews documentation topics: Two-way binding Targets for data-linking Data-linked <input> elements (textbox - checkbox - radio) Data-linked <select> elements Data-linked <textarea> elements Data-linking to contenteditable elements Setting the default trigger behavior
Commits on May 28, 2016
  1. Commit 76 (v0.9.76 - Beta)

    BorisMoore committed May 28, 2016
    - New support for compiled View Models - using $.views.viewModels(...),
      and new map(), merge() and unmap() APIs for converting between plain
      object hierarchies and compiled View Model hierarchies - covered by
      the new documentation topics:,,
    - Added escaping of = in {{>...}} and {{html:...}}
    - Prevent use of ['constructor'] in template expressions (so cannot
      instantiate new Function)
    - New global setting for default trigger on two-way binding:
      $.views.settings.trigger(). E.g. set to $.views.settings.trigger(true)
      to trigger on character entry. Full documentation and unit tests to follow.
    - Improved {on } binding. Documentation to follow.
    - Several minor bug fixes
    - Several new and improved documentation topics: Building apps (JsViews) Data / View Model (JsRender) Data / View Model (JsViews) Compiled View Models (JsViews) Compiled View Models (JsViews) Webpack support Browserify support
    - Keyboard shortcuts provided for 'Search' on
      Ctrl+/: search, Enter: new search, Escape: quit,
      Ctrl+Left/Right Arrow: Prev/Next result
    - Many additional unit tests
Commits on Apr 3, 2016
  1. Commit 75 (v0.9.75 - Beta)

    BorisMoore committed Apr 3, 2016
    Several new and improved documentation topics:
    - JsRender view hierarchy
    - Iterating over arrays: accessing the array index
    - Contextual parameters
    - Accessing parent data
    - Building apps
    - Data / View Model
    - Using templates
    - Registering templates: $.templates()
    - Using helpers
    - Registering helpers: $.views.helpers()
    - Using converters
    - Registering converters: $.views.converters()
    Unit tests
    - Many new unit tests added, especially for Browserify scenarios
    Bug fixes
    - BorisMoore/jsrender#295 Issue with Browserify when loading
      jQuery statically, and JsRender/JsViews as a Browserify module
Commits on Mar 20, 2016
  1. Commit 74 (v0.9.74 - Beta)

    BorisMoore committed Mar 20, 2016
    Updates and new documentation topics:
    - Important updates and improvements to $.views.settings APIs:
      settings.allowCode(), settings.delimiters(), settings.debugMode() plus
      new settings.advanced(). See new documentation at and
    - Support for unobserve() is now complete (and simplified): See updated
      documentation topic:
    - Support for namespaces associated with observable changes is
      now complete: See new documentation topic:
    - Support for error handling and debugging improved and extended, with
      some small changes to APIs - including for $.views.settings.debugMode,
      with full documention at
    - {{>}} is now equivalent to {{>#data}}
    Minor breaking changes:
    - $.observe(arr, "length", callback) now only listens to length, not to
      array changes but $.observe(arr, arr, "length", callback) listens to
      both length and array changes
    - Namespaces with observeAll:
      $.observable(objectOrArray).observeAll(namespace, handler) is now
      written: $.observable(namespace, objectOrArray).observeAll(handler) -
      and similarly for .unobserveAll()
    - JsRender and JsViews no longer use the (0, eval)('this') expression
      to get the window object. This means that they can now be minified
      by the Visual Studio minifier, in spite of it not correctly minifying
      this expression. See #323
    Bug fixes:
    - #334 (computed
      observable - depends)
    - Several additional small bug fixes
    - This update also includes a security fix
Commits on Feb 16, 2016
  1. Commit 73 (v0.9.73 - Beta)

    BorisMoore committed Feb 16, 2016
    Minor update: no important changes or bug fixes
    - Updated copyright and updated links to latest jQuery, QUnit etc.
    - Some documentation improvements
      New documentation topic on JsViews view object, and methods:
      - view.refresh()
      - view.contents()
      - view.nodes()
      - view.childTags()
Commits on Jan 28, 2016
  1. Commit 72 (v0.9.72 - Beta)

    BorisMoore committed Jan 27, 2016
    - $.observe() improvements: New "**" wild card path for observing
      all changes under an object: "object.**" - for 'declarative observeAll'
    - Improvements to computed observables: 'depends' can now include
      both "**" wild card, and functions that observe changes and handle
      a callback programmatically. ""
    - trigger=true now also accepts other truthy value e.g. trigger=1
    - Improvements to <select> data-linking:
      It is no longer necessary to data-link the <option> 'selected' property.
      Multiselect - data-links to array of values.
    - Improved syntax error messages:
    - Improved tag parsing:
    - Unlinked JsRender tags - {{}} - are supported within the attribute markup
      of an HTML element, without needing to set link=false on the tag.
      (link=false can still be used for JsRender tags in HTML element block
      contentfor, to make the tags 'render-only' with no data-linking and no
      inserted script-node data-link markers)
    - Minor bug fixes, including:
    - Many documentation additions and improvements, including:
      Data-linked paths topic:
      Computed observables topic:
      New computed observables samples:
      Documentation for #index and #getIndex():
    - CDN support: JsRender and JsViews are now both available on the cdnjs CDN
      at ""
      and "".
Commits on Dec 22, 2015
Commits on Dec 21, 2015
  1. Commit 71 (v0.9.71 - Beta)

    BorisMoore committed Dec 21, 2015
    - Many documentation improvements - including new JsViews
      Quickstart, and additional JsViews API topics.
    - New "Search" feature on
      (BorisMoore/ and
    - #322: view.get(true)
      now returns the first inner (child) view (of any type)
    - Added support for {else} in data-link expressions when doing
      top-level data-linking: data-link="{if a tmpl='yes'}{else tmpl='no'}"
    - Simplified API for unlink:
      $(selector).unlink() replaces previous API: $(selector).unlink(true).
      $.unlink(selector) replaces previous API: $.unlink(true, selector).
    - link methods on tags and views are only added if linked.
    - Added support for <label> wrapping radio buttons in data-linked radio
      button group - so you can click on the label to change the radio button
    Minor breaking change:
    - {{mytag tmpl="foo"}} - "foo" template now replaces or wraps the content,
      as previously, but unlike previously, does not take precedence over a
      template declared in the tag definition. That template is still used to
      render {{mytag}}, but if it includes content, as {{include tmpl=#content/}},
      then the "foo" template will replace the rendered block content
      {{mytag}}...{{/mytag}}, or can itself wrap any block content using
      {{include tmpl=#content/}}
    - Bug fixes:
Commits on Sep 24, 2015
  1. Commit 70 (v1.0.0-beta.70 - Beta Candidate)

    BorisMoore committed Sep 24, 2015
    - minor update:
      Improved syntax error detection
Commits on Sep 7, 2015
  1. Commit 69 (v1.0.0-beta.69 - Beta Candidate)

    BorisMoore committed Sep 7, 2015
    - Support for $(selector).unlink(); or $.unlink(selector);
    Bug Fixes:
    - #315
Commits on Sep 2, 2015
  1. Commit 68 (v1.0.0-beta.68 - Beta Candidate)

    BorisMoore committed Sep 2, 2015
    Updated documentation.
    See also
    - One very minor breaking change: the $.views.compile(...) alias
      for $.templates has been removed from jsrender.js, but is still
      available for Node.js (e.g. for Hapi templates integration) as
    - JsRender is now published on NPM. Install using $ npm install jsrender
    - Browserify Support:
      JsRender on Node.js provides a built-in Browserify transform
      for including compiled JsRender templates from the server, as part of
      the client javascript bundle generated by Browserify.
      Usage example:
      var tmplify = require('jsrender/tmplify');
      browserify(...) ... .transform(tmplify) ...
      See also,
    - Continuing work for deployment to NPM. See
    Bug Fixes:
    - BorisMoore/jsrender#172
Commits on Aug 18, 2015
  1. Commit 65 (v1.0.0-beta.65 - Beta Candidate)

    BorisMoore committed Aug 17, 2015
    - The global namespace when JsRender is loaded without jQuery
      is now window.jsrender. (Previously it was window.jsviews).
      So when using JsRender without jQuery, you can write:
      var $ = jsrender; - and use the $ var it in the same way you
      would use the global $ when JsRender is loaded with jQuery:
      e.g. $.templates(...) or $.views.helpers(...) etc.
    - AMD support has been improved and simplified. All AMD
      modules, including JsRender, with or without jQuery, now
      return the jQuery object (if loaded) or the analogous
      JsViews object.
    - Node.js support and integration has been improved - along
      with improved CommonJS support, and Browserify integration.
      The file system APIs now use the syntax tmpl="./file/path.html".
      The Node.js version of jsrender.js is available as a separate
      file (available at //
      The Node.js version of JsRender provides the complete set of
      JsRender APIs and features, together with integration
      with NodeJS view-engines such as Express and Hapi, APIs
      for loading templates from the file system, etc.
      The file system APIs now use the syntax tmpl="./file/path.html".
      It also includes a built-in Browserify transform (see "Browserify
      Support: below).
      (Note: JsRender and JsViews will soon be published to NPM).
    - The behavior when loading multiple instances of JsRender or
      JsViews files has been changed: When loading a new instance,
      the previous instance $.views, $.templates, etc. is no longer
      overwritten. So a component using JsRender or JsViews will not,
      when loaded, cause another already loaded component also using
      JsViews/JsRender to fail (except for collisions arising in the
      unlikely case where both happen to use the same
      template/converter/helper name).
      As part of this modified behavior, the noConflict support
      for JsRender had been removed.
    - observeAll() for cyclic objects is now supported for the
      vast majority of cases.
      See #304
    - Improved support for data-linking to data- attributes:
      <elem data-link="data-foo{:expr}" ...>.
      After data-linking, the value of the data-foo attribute
      will be expr.toString(), but $.data(element, "foo") and
      $(element).data("foo") will actually return the value of
      expr, even if of type object.
      See #306
    - Browserify Support:
      JsRender on Node.js provides a built-in Browserify
      transform - jsrender.tmplify, for including compiled JsRender
      templates from the server, as part of the client javascript
      bundle generated by Browserify.
      Usage example:
      var $jsr = require('jsrender');
      browserify(...) ... .transform($jsr.tmplify) ...
      See also
    - Initial work for deployment to Bower and NPM. See
    Bug Fixes:
    - BorisMoore/jsrender#263
      Caching of template on script elements. (Unit tests
    - #304
      ObserveAll on cyclic objects
    - #306
      'data-xxxx' attribute using data-link
    - #307
Commits on Aug 17, 2015
Commits on May 20, 2015
  1. Commit 64 (Beta Candidate)

    BorisMoore committed May 20, 2015
    - debugMode is now false by default - which means
      that on error, an exception is thrown, rather than
      outputting an error message in the rendered output.
      To obtain previous behavior, set debugMode to true:
    - jQuery UI widgets: There is now a specific syntax for
      setting widget properties. A tag property with an initial
      underscore will correspond to the corresponding property
      of the widget, and it can be set, and optionally data-linked
      {^{datepicker myDate _changeMonth=true ^_maxDate=myEndDate/}}
    - The $.views.sub.cvt() no longer exists. Use tag.cvtArgs().
    - AMD and CommonJs support for both JsRender and JsViews,
      providing both for NodeJS scenarios, and scenarios in which
      requireJS or similar AMD script loaders are used to load
      JsRender, JsObservable or JsViews.
    - Support for JsRender in NodeJS:
      Support for Express and Hapi view engines using JsRender
      Support for loading templates from file, on Node, using
      the syntax: tmpl="@file.path"
    - $.templates() now has an equivalent alternate name (alias):
      $.views.compile() which allows for immediate integration in some
      frameworks, such as Hapi templated views.
    - Similarly, a compiled template now has an alternative shortcut API
      for the render method. The compiled template is it's own render
      function, so for a compiled template: var tmpl = $.templates(...);
      the following are equivalent:
      tmpl.render(data, helpers);
      tmpl(data, helpers);
    - Support for allowCode has been simplified and improved. Docs to
      follow. You can now enable allowCode globally using
      $.views.settings.allowCode. A new tag: {{*: expression}} will
      return the evaluated expression - like {{: expression}} - but here
      the expression can allow any code.
    - JsRender now has noConflict support, for loading a new instance of
      JsRender, without conflict with an already loaded instance.
    - A new data-link binding: data-link="data-foo{: ...}" permits
      data-linking directly to data-foo properties of HTML elements.
    - Tag property names can now include '.' and '_' characters:
      {{myTag _a=3 b.c=4 /}}
    - Support for {^{on someMethod ... /}} as a button. For example,
      {^{on someMethod ...}}Go{{/on}} is equivalent to
      <button data-link="{on someMethod ...}">Go</button>
    - {^{foo class=...}} lets you set (and optionally bind to) the class
      of the linked HTML element.
    - {^{foo id=...}} lets you set (and optionally bind to) the id of the
      linked the HTML element.
    - {^{foo name=...}} lets you set (and optionally bind to) the name
      property of the linked HTML element.
    - If a custom tag has setSize specified as true: {..., setSize: true, ...}
      then you can set and optionally bind to the with and height properties
      to control the width and height of the linked HTML element:
      {^{foo ... width=55 ^height=expression ...}}
    - Support simplified syntax when defining custom tags with just a markup
      string (template), or jsut a render method:
      $.views.tags("myTag", "this is the template");
      $.views.tags("a", function(...){
         //this is the render function
    - The debug helpers: {{dbg:}} {{dbg ...}} {{~dbg()}} now throw and catch,
      rather than including a debugger; statement. To use this feature set
      your browser/debugger to stop on caught exceptions.
      (See also BorisMoore/jsrender#239)
    - A lot of changes have been made to considerably optimize performance
      when using JsRender to render simple templatesPerf. Optimized template
      will not need to instantiate view objects, and hence will be faster.
      A compiled template has a tmpl.useViews property which shows whether
      it allowed that optimization. (tmpl.useViews false)
    - Many improvements on jQuery UI widget integration. Docs and samples
      to come. See also download/sample-tag-controls/jsviews-jqueryui-widgets.js
    - The git project now has build support, with Gulp.
    - Improved support for data-linking without initial rendering,
      data-link="...^{...}" - which is particularly useful when using
      server-rendered content linked subsequently in browser.
    Bug Fixes:
    - BorisMoore/jsrender#239:
    - BorisMoore/jsrender#252
      (Improved syntax error message e.g.:
      '{{include}} block has {{/for}} with no open {{for}}'
    - #300
    - #301
    - #302
    - #303
    - #213 (Detection and error message)
Commits on Mar 5, 2015
  1. Commit 63 (Beta Candidate)

    BorisMoore committed Mar 5, 2015
    - Removed minor undocumented feature where custom tags
      could return false from init.
    - When an observableArray changes, the property change
      notification for the length change is now before the
      array change notification. (For better behavior in some
      complex scenarios).
    - A new itemVar feature allows you to set a context variable
      on any tag, to provide access to the block context, even
      within nest tag blocks below.
      e.g. {{for people itemVar="~person"}}
      See BorisMoore/jsrender#256
    - New dom change notifications feature: A new domChange()
      method on data-linked tags will raise a "jsv-domchange"
      event on the parent element. {^{for}} and {^{if}} both
      use this method to raise a "jsv-domchange" event whenever
      they modify the DOM as a result of observable data changes.
      See, and unit
      tests for "jsv-domchange".
    - childTags("myFlowTag") can now be used to find instances
      of flow tags such as {{for}} and {{if}}, as well as
      custom (non-flow) tags. See unit tests,
      e.g. view.childTags(true, "if")
    - Many new unit tests added for the above new features.
    - Some small additional bug fixes.
Commits on Feb 9, 2015
  1. Commit 62 (Beta Candidate)

    BorisMoore committed Feb 9, 2015
    - Improved support for data-linked element expressions
      using tags
      e.g. <div data-link="{if foo tmpl='...'}">
      This now supports one or more {else} expressions
      <div data-link="{if a tmpl='...'}{else b tmpl='...'}">
      It also supports linking tag expressions to different
      targets, such as title{... css-color{... class{... etc.
      data-link="title{for items tmpl='...'}{else tmpl='...'}"
      See #293
    - Tag inheritance now supports multi-level inheritance with
      easy invocation of the base class implementation using
      this.base(...) or this.baseApply(arguments):
        baseTag: "for",
        onAfterLink: function() {
      Similarly for callbacks declared declaratively on tags:
      {{for items onAfterLink=~myHelper onUpdate=~dbg}}...
      The above uses the built in ~dbg helper, and a user-provided
      helper, such as:
      function myHelper() {
    - Many new unit tests added for the above new features.
    - Some small additional bug fixes.
Commits on Dec 25, 2014
  1. Commit 61 (Beta Candidate)

    BorisMoore committed Dec 25, 2014
    - Improved support for computed values in paths: support
      and bug fixes for templates (and data-linking) which
      include complex expressions with computed properties
      (with or without parameters), including computed values
      which return objects, and using paths which chain
      computed values - for example:
      "a.b().c.d.e(p, q).f"
    - Full support for deep paths with computed values, with
      live data binding to any chosen depth (see Breaking
      Change below), and optionally involving complex
      expressions - for example:
      "a.b()^c.d.e(p + (r - 1), q + 't').f + 'x' + g"
    (see #285):
    - Depth of binding of paths is now controlled by the '^'
      character, whether or not the path includes computed
      For example:
      will do leaf binding only, so will 'observe' (listen to)
      changes in c, but NOT changes in b(). (This is breaking,
      since previously this path DID observe b()...)
      To observe both c and b(), use the path:
      To observe ALL changes in the path - a, b() and c(),
    - Improved support for custom tag inheritance from
      base tag - e.g.: {baseTag: "for", ...}
    Bug Fixes
    - Several small additional bug fixes.
    - Many new unit tests added.
Commits on Oct 15, 2014
  1. Commit 60 (Beta Candidate)

    BorisMoore committed Oct 15, 2014
    - Some bug fixes for childTags() API when in element-only
    - Additional work on data-linking with deep paths and
      using "onerror" - plus memory leak bug fix, for scenarios
      called out in:
    - Some additional bug fixes.
    - Many new unit tests added.
Commits on Sep 30, 2014
  1. Commit 59 (Beta Candidate)

    BorisMoore committed Sep 30, 2014
    - Top-level binding target can now include elements with
      templated content. Top-level binding will now skip templated
      data-bound elements, rather than adding additional dual
    - Converters can be swapped through data-linked tag properties.
      e.g see unit tests:
      <input data-link="{twoWayTag name ^convert=~options.cvt}"/>
    - Data-linking with deep paths and using "onerror" now supports
      dynamically moving between valid and invalid paths (missing
      objects deeper in path) while maintaining full data-binding
      to the whole path.
    Bug fixes:
    - Some additional bug fixes.
    - Many new unit tests added.