Skip to content

Commit bde012c

Browse files
committed
Commit 77 (v0.9.77 - Beta)
- 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: http://www.jsviews.com/#link2way Two-way binding http://www.jsviews.com/#link-targets Targets for data-linking http://www.jsviews.com/#link-input Data-linked <input> elements (textbox - checkbox - radio) http://www.jsviews.com/#link-select Data-linked <select> elements http://www.jsviews.com/#link-textarea Data-linked <textarea> elements http://www.jsviews.com/#link-contenteditable Data-linking to contenteditable elements http://www.jsviews.com/#jsvsettings/trigger Setting the default trigger behavior
1 parent 83d8bc9 commit bde012c

16 files changed

+309
-95
lines changed

README.md

+9-5
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,20 @@ jsviews.js is available from [downloads](http://www.jsviews.com/#download) on th
1515
CDN delivery is available from the ***[cdnjs](https://cdnjs.com)*** CDN at [cdnjs.com/libraries/jsviews](https://cdnjs.com/libraries/jsviews).
1616

1717
Alternatively:
18+
1819
- It can be installed with ***[Bower](http://bower.io/search/?q=jsviews)***, using `$ bower install jsviews`
19-
- It can be loaded using an AMD script loader, such as RequireJS
20-
- For installation using *Node.js* (*npm*) -- and browser loading using *Browserify* or *webpack* -- see *[JsRender Node.js Quickstart](http://www.jsviews.com/#jsr-node-quickstart)*
20+
- It can be loaded using an *AMD script loader*, such as RequireJS
21+
- For installation using *Node.js* (*npm*), and loading using [Browserify](http://browserify.org/) or [webpack](https://webpack.github.io/), see *[JsViews as a Browserify module](http://www.jsviews.com/#node/browserify@jsviews)* and *[JsViews as a webpack module](http://www.jsviews.com/#node/webpack@jsviews)*
2122

22-
*Example HTML page:* [Loading JsViews](http://www.jsviews.com/#download/pages-jsv)
23+
(Note that *jsviews.js* includes all of *jsrender.js* code -- so *jsrender.js* does not need to be loaded first.)
2324

2425
<h3>JsRender and JsViews</h3>
25-
**JsRender** is used for data-driven rendering of templates to strings, ready for insertion in the DOM. (See *[JsRender Quickstart](http://www.jsviews.com/#jsr-quickstart)* and [JsRender GitHub repository](https://github.com/BorisMoore/jsrender)).
2626

27-
**[JsRender](https://github.com/BorisMoore/jsrender)** and **[JsViews](https://github.com/BorisMoore/jsviews)** together provide the next-generation implementation of the official jQuery plugins *[JQuery Templates](https://github.com/BorisMoore/jquery-tmpl)*, and *[JQuery Data Link](https://github.com/BorisMoore/jquery-datalink)* -- and supersede those libraries.
27+
*JsRender* is used for data-driven rendering of templates to strings, ready for insertion in the DOM. (See *[JsRender Quickstart](http://www.jsviews.com/#jsr-quickstart)* and [JsRender GitHub repository](https://github.com/BorisMoore/jsrender)).
28+
29+
*JsViews* incorporates *JsRender* templates, together with data-binding, *[observable data](http://www.jsviews.com/#jsoapi)* and MVVM support. It provides a powerful platform for building dynamic interactive websites and single-page apps.
30+
31+
(Note: *JsRender* and *JsViews* together provide the next-generation implementation of the official jQuery plugins *[JQuery Templates](https://github.com/BorisMoore/jquery-tmpl)*, and *[JQuery Data Link](https://github.com/BorisMoore/jquery-datalink)* -- and supersede those libraries.)
2832

2933
<h2>JsViews usage</h2>
3034

jquery.observable.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*! JsObservable v0.9.76 (Beta): http://jsviews.com/#jsobservable */
1+
/*! JsObservable v0.9.77 (Beta): http://jsviews.com/#jsobservable */
22
/*
33
* Subcomponent of JsViews
44
* Data change events for data-linking

jquery.observable.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jquery.observable.min.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jquery.views.js

+23-16
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*! jquery.views.js v0.9.76 (Beta): http://jsviews.com/ */
1+
/*! jquery.views.js v0.9.77 (Beta): http://jsviews.com/ */
22
/*
33
* Interactive data-driven views using JsRender templates.
44
* Subcomponent of JsViews
@@ -44,7 +44,7 @@ var setGlobals = $ === false; // Only set globals if script block in browser (no
4444
jsr = jsr || setGlobals && global.jsrender;
4545
$ = $ || global.jQuery;
4646

47-
var versionNumber = "v0.9.76",
47+
var versionNumber = "v0.9.77",
4848
requiresStr = "JsViews requires ";
4949

5050
if (!$ || !$.fn) {
@@ -88,6 +88,7 @@ var document = global.document,
8888
rEscapeQuotes = /['"\\]/g; // Escape quotes and \ character
8989
if ($.link) { return $; } // JsViews is already loaded
9090

91+
$subSettings.trigger = true;
9192
var activeBody, rTagDatalink, $view, $viewsLinkAttr, linkViewsSel, wrapMap, viewStore, oldAdvSet,
9293
jsvAttrStr = "data-jsv",
9394
elementChangeStr = "change.jsv",
@@ -402,9 +403,9 @@ function updateContent(sourceValue, linkCtx, attr, tag) {
402403
view = linkCtx.view,
403404
targetVal = linkCtx._val,
404405
oldLinkCtx = view.linkCtx,
405-
// If not a tag and not targeting HTML, we can use the ._val obtained from getTargetVal()
406+
// If not a tag we can use the ._val obtained from getTargetVal()
406407
// and only update when the new value (sourceValue) has changed from the previous one
407-
change = tag || attr === HTML;
408+
change = tag;
408409

409410
if (tag) {
410411
// Initialize the tag with element references
@@ -534,7 +535,8 @@ function updateContent(sourceValue, linkCtx, attr, tag) {
534535
// Insert and link new content
535536
promise = view.link(view.data, target, prevNode, nextNode, sourceValue, tag && {tag: tag._tgId, lazyLink: tag.tagCtx.props.lazyLink});
536537
} else {
537-
// data-linked value targeting innerHTML: data-link="html{:expr}"
538+
// data-linked value targeting innerHTML: data-link="html{:expr}" or contenteditable="true"
539+
renders = renders && targetVal !== sourceValue;
538540
if (renders) {
539541
$target.empty();
540542
}
@@ -1890,17 +1892,22 @@ function bindTo(binding, tag, linkedElem, cvtBk) {
18901892
paths = linkCtx.fn.paths;
18911893

18921894
if (binding && paths) {
1893-
oldTrig = linkedElem._jsvTr;
1894-
newTrig = $subSettings.trigger;
1895+
oldTrig = linkedElem._jsvTr || false;
18951896
if (tag) {
18961897
cvtBk = tag.convertBack || cvtBk;
1897-
newTrig = tag.tagCtx.props.trigger || newTrig;
1898+
newTrig = tag.tagCtx.props.trigger;
18981899
}
1900+
newTrig = newTrig === undefined ? $subSettings.trigger : newTrig;
18991901
if (oldTrig !== newTrig) {
1900-
linkedElem._jsvTr = newTrig;
19011902
$linkedElem = $(linkedElem);
19021903
bindElChange($linkedElem, oldTrig, "off");
1903-
bindElChange($linkedElem, newTrig, "on");
1904+
bindElChange(
1905+
$linkedElem,
1906+
linkedElem._jsvTr
1907+
// Trigger is noop except for text box, textarea, contenteditable...
1908+
= (linkedElem.tagName === "INPUT" && linkedElem.type !== CHECKBOX && linkedElem.type !== RADIO || linkedElem.type === "textarea" || linkedElem.contentEditable === TRUE) && newTrig,
1909+
"on"
1910+
);
19041911
}
19051912

19061913
paths = (bindto = paths._jsvto) || paths[0];
@@ -2033,12 +2040,6 @@ function removeViewBinding(bindId, linkedElemTag, elem) {
20332040
}
20342041
}
20352042
$linkedElem = tag.linkedElem;
2036-
linkedElem = $linkedElem && $linkedElem[0] || linkCtx.elem;
2037-
2038-
if (trigger = linkedElem && linkedElem._jsvTr) {
2039-
bindElChange($linkedElem || $(linkedElem), trigger, "off");
2040-
linkedElem._jsvTr = undefined;
2041-
}
20422043

20432044
if (tag.onDispose) {
20442045
tag.onDispose();
@@ -2053,6 +2054,12 @@ function removeViewBinding(bindId, linkedElemTag, elem) {
20532054
}
20542055
}
20552056
}
2057+
linkedElem = $linkedElem && $linkedElem[0] || linkCtx.elem;
2058+
2059+
if (trigger = linkedElem && linkedElem._jsvTr) {
2060+
bindElChange($linkedElem || $(linkedElem), trigger, "off");
2061+
linkedElem._jsvTr = undefined;
2062+
}
20562063
view = linkCtx.view;
20572064
if (view.type === "link") {
20582065
view.parent.removeViews(view._.key, undefined, true); // A "link" view is associated with the binding, so should be disposed with binding.

jquery.views.min.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jquery.views.min.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jsrender.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*! JsRender v0.9.76 (Beta): http://jsviews.com/#jsrender */
1+
/*! JsRender v0.9.77 (Beta): http://jsviews.com/#jsrender */
22
/*! **VERSION FOR WEB** (For NODE.JS see http://jsviews.com/download/jsrender-node.js) */
33
/*
44
* Best-of-breed templating in browser or on Node.js.
@@ -44,7 +44,7 @@ var setGlobals = $ === false; // Only set globals if script block in browser (no
4444

4545
$ = $ && $.fn ? $ : global.jQuery; // $ is jQuery passed in by CommonJS loader (Browserify), or global jQuery.
4646

47-
var versionNumber = "v0.9.76",
47+
var versionNumber = "v0.9.77",
4848
jsvStoreName, rTag, rTmplString, topView, $views,
4949

5050
//TODO tmplFnsCache = {},
@@ -412,10 +412,10 @@ function convertVal(converter, view, tagCtx, onError) {
412412

413413
tagCtx.view = view;
414414

415-
tag.ctx = tagCtx.ctx || {};
415+
tag.ctx = tagCtx.ctx || tag.ctx || {};
416416
tagCtx.ctx = undefined;
417417

418-
value = tag.cvtArgs(tag.convert || converter !== "true" && converter)[0]; // If there is a convertBack but no convert, converter will be "true"
418+
value = tag.cvtArgs(converter !== "true" && converter)[0]; // If there is a convertBack but no convert, converter will be "true"
419419

420420
// Call onRender (used by JsViews if present, to add binding annotations around rendered content)
421421
value = boundTag && view._.onRender
@@ -431,7 +431,7 @@ function convertArgs(converter) {
431431
view = tagCtx.view,
432432
args = tagCtx.args;
433433

434-
converter = tag.convert || converter;
434+
converter = converter || tag.convert;
435435
converter = converter && ("" + converter === converter
436436
? (view.getRsc("converters", converter) || error("Unknown converter: '" + converter + "'"))
437437
: converter);

jsrender.min.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jsrender.min.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)