Jsviews
Interactive data-driven views, MVVM and MVP, built on top of JsRender templates
Install / Use
/learn @BorisMoore/JsviewsREADME
JsViews: next-generation MVVM and MVP framework - bringing templates to life
The power of MVVM, the flexibility of JavaScript, the speed and ease of JsRender templates and jQuery<br/>
JsViews builds on top of JsRender templates, and adds data-binding and observable data, to provide a fully-fledged MVVM platform for easily creating interactive data-driven single-page apps and websites.
Documentation and downloads
Documentation, downloads, samples and API docs and tutorials are available on the www.jsviews.com website.
The content of this ReadMe is available also as a JsViews Quickstart.
JsViews installation
jsviews.js is available from downloads on the jsviews.com site.
CDN delivery is available from the jsdelivr CDN at jsdelivr.com/package/npm/jsviews, and from the cdnjs CDN at cdnjs.com/libraries/jsviews.
Alternatively:
- It can be installed with Bower, using
$ bower install jsviews - It can be loaded using an AMD script loader, such as RequireJS
- For installation using Node.js (npm), and loading using Browserify or webpack, see JsViews as a Browserify module and JsViews as a webpack module
(Note that jsviews.js includes all of jsrender.js code -- so jsrender.js does not need to be loaded first.)
JsRender and JsViews
JsRender is used for data-driven rendering of templates to strings, ready for insertion in the DOM. (See JsRender Quickstart and JsRender GitHub repository).
JsViews incorporates JsRender templates, together with data-binding, observable data and MVVM support. It provides a powerful platform for building dynamic interactive websites and single-page apps.
(Note: JsRender and JsViews together provide the next-generation implementation of the official jQuery plugins JQuery Templates, and JQuery Data Link -- and supersede those libraries.)
JsViews usage
Data-linked templates
JsViews provides data-linking - so that JsRender templates become data-bound:
- Data-linked tags or elements in your templates will update automatically whenever the underlying data changes.
- Some data-linked tags or elements provide two-way data-linking, so that user interactions will trigger "observable" changes to the underlying data (which may then trigger other updates elsewhere in your templated UI).
Data-linked template tags:
Any JsRender tag, {{...}} can be data-linked by writing {^{...}}, as in:
<ul>
{^{for people}} <!--List will update when people array changes-->
<li>{^{:name}}</li> <!--Will update when name property changes-->
{{/for}}
</ul>
Data-linked HTML elements:
HTML elements within templates can be data-linked by adding a data-link attribute:
<input data-link="name"/> <!--Two-way data-binding to the name property-->
<span data-link="name"></span> <!--Will update when name property changes-->
HTML elements within 'top-level' page content can also be data-linked -- see below.
Render and link a template
With JsRender, you call the render() method, then insert the resulting HTML in the DOM.
var html = tmpl.render(data, helpersOrContext);
$("#container").html(html);
With JsViews, you can instead call the link() method:
tmpl.link("#container", data, helpersOrContext);
which in one line of code will:
- render the template
- insert the resulting HTML as content under the HTML
containerelement - data-link that content to the underlying
data
Now observable changes in the data will automatically trigger updates in the rendered UI.
There are two ways of calling the link() method:
- If you have a reference to the <em>template object</em>, call
template.link(...) - If you have registered the template by name (
"myTmpl"), calllink.myTmpl(...)
Example: - Template from string
var tmpl = $.templates("{^{:name}} <input data-link='name' />");
var person = {name: "Jim"};
tmpl.link("#container", person);
Example: - Template from script block
<script id="myTemplate" type="text/x-jsrender">
{^{:name}} <input data-link="name" />
</script>
var tmpl = $.templates("#myTemplate");
var person= {name: "Jim"};
tmpl.link("#container", person);
Example: - Named template from string
$.templates("myTmpl1", "{^{:name}} <input data-link='name' />");
var person= {name: "Jim"};
$.link.myTmpl1("#container", person);
Example: - Named template from script block
<script id="myTemplate" type="text/x-jsrender">
{^{:name}} <input data-link="name" />
</script>
$.templates("myTmpl2", "#myTemplate");
var data = {name: "Jim"};
$.link.myTmpl2("#container", data);
Result: After each link() example above the container element will have the following content:
Jim <input value="Jim" />
with the name property of person object data-linked to the "Jim" text node and two-way data-linked to the <input />
See: Playing with JsViews for working samples, such as this one
<h3 id="jsv-quickstart@toplink"><i>Top-level data-linking</i></h3>You can use data-linking not only for templated content, but also to data-bind to top-level HTML content in your page:
$.link(true, "#target", data);
This will activate any declarative data-binding (data-link="..." expressions) on the target element - or on elements within its content.
Making "observable" changes to objects and arrays
In current JavaScript implementations, modifying objects or arrays does not raise any event, so there is no way for the change to be detected elsewhere. JsViews dynamic data-bound UI solves this through <em>data-linking</em>, using the <em>JsObservable observer pattern</em>.
The JsViews $.observable() API provides a way for you to change objects or arrays <em>observably</em>. Each change will raise a <a href="http://www.jsviews.com/#onpropchange">property change</a> or <a href="http://www.jsviews.com/#onarrchange">array change</a> event.
Modify an object observably
$.observable(person).setProperty("name", newName);
$.observable(person) makes the person object "observable", by providing a setProperty(...) method. Use setProperty to change a value, and the change will be "observed" by the declarative data-binding in the template.
Modify an array observably
$.observable(people).insert(newPerson);
$.observable(people) makes the people array "observable", by providing methods like insert(...) and remove(...). Use them to make changes to arrays, and the changes will be "observed" by data-bound elements and tags in the template - such as the {^{for dataArray}} tag.
Responding to data changes
JsViews uses the <a href="http://www.jsviews.com/#onpropchange">property change</a> or <a href="http://www.jsviews.com/#onarrchange">array change</a> events to make any <a href="http://www.jsviews.com/#linked-template-syntax">data-linked tags or elements</a> in your templates update automatically in response to each observable change in your underlying data. In addition, with two-way data-linking, it ensures that those events are raised when the user interacts with a data-linked template, and causes changes to the underlying data.
observe() and observeAll()
The $.observe() and $.observable().observeAll() APIs make it very easy for you to register event handlers or listeners, so your code can listen to specific observable changes made to your data objects or view models:
$.observe(person, "name", function(...) {
// The "name" property of person has changed
...
});
$.observable(person).observeAll(function(...) {
// A property of person, or a nested object property, has changed
...
});
Accessing the view hierarchy
Each instance of a rendered template or a template block tag is associated with a JsViews "view" object -- so nested tags lead to a hierarchy of view objects. The view hierarchy shows how the underlying data objects map to the rendered UI.
From UI back to data:
Use $.view(elem) to get from a DOM element to the corresponding view object for that part of the rendered conten
Related Skills
node-connect
343.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
90.0kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
343.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
343.1kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
