Skip to content

Commit c433fc3

Browse files
committedAug 26, 2017
Commit 88 (v0.9.88 - Beta)
Minor bug fixes and improvements. No breaking changes. Feature improvements: - Added support for 'mouse editing' of textboxes for browsers supporting HTML5 'oninput' event. #391 Minor bug fix: - #388 Unit tests: - Several additional unit tests Documentation: - New documentation topics added for JsRender custom tags: http://www.jsviews.com/#tags http://www.jsviews.com/#tagsapi - New documentation topics added for $.views object: http://www.jsviews.com/#viewsobject http://www.jsviews.com/#jsvviewsobject - New documentation topics added for compiled template objects: http://www.jsviews.com/#templateobject http://www.jsviews.com/#jsvtemplateobject - New documentation topics and samples added for using {{props}} to iterate over a top-level dictionary/hash data-collection: http://www.jsviews.com/#samples/editable/hash http://www.jsviews.com/#jsvpropstag@load-hash - Several improvements and bug fixes on www.jsviews.com site.
1 parent 8559dcf commit c433fc3

28 files changed

+664
-556
lines changed
 

‎jquery.observable.js

+12-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*! JsObservable v0.9.87 (Beta): http://jsviews.com/#jsobservable */
1+
/*! JsObservable v0.9.88 (Beta): http://jsviews.com/#jsobservable */
22
/*
33
* Subcomponent of JsViews
44
* Data change events for data-linking
@@ -44,7 +44,7 @@ if (!$ || !$.fn) {
4444
throw "JsObservable requires jQuery"; // We require jQuery
4545
}
4646

47-
var versionNumber = "v0.9.87",
47+
var versionNumber = "v0.9.88",
4848
_ocp = "_ocp", // Observable contextual parameter
4949
$observe, $observable,
5050

@@ -473,7 +473,7 @@ if (!$.observe) {
473473
}
474474

475475
var i, p, skip, parts, prop, path, dep, unobserve, callback, cbId, inId, el, data, events, contextCb, innerContextCb,
476-
items, cbBindings, depth, innerCb, parentObs, allPath, filter, initNsArr, initNsArrLen, view,
476+
items, cbBindings, depth, innerCb, parentObs, allPath, filter, initNsArr, initNsArrLen, view, cbItemCount,
477477
ns = observeStr,
478478
paths = this != 1 // Using != for IE<10 bug- see jsviews/issues/237
479479
? concat.apply([], arguments) // Flatten the arguments - this is a 'recursive call' with params using the 'wrapped array'
@@ -551,7 +551,14 @@ if (!$.observe) {
551551
}
552552
}
553553
depth = 0;
554+
cbItemCount = 0;
554555
for (i = 0; i < l; i++) {
556+
if (cbItemCount) {
557+
cbItemCount--; // contextCb was moved to a contextual parameter outer context. Needs to revert after cbItemCount
558+
} else {
559+
contextCb = innerContextCb;
560+
}
561+
555562
path = paths[i];
556563
if (path === "" || path === root) {
557564
continue;
@@ -586,14 +593,15 @@ if (!$.observe) {
586593
} else if (path && path._cxp) { // contextual parameter
587594
view = path.shift(); // Contextual data
588595
if (_ocp in view) {
589-
root = view;
596+
root = view; // observable contextual parameter
590597
contextCb = 0;
591598
} else {
592599
contextCb = $sub._gccb(view); // getContextCb: Get context callback for the contextual view (where contextual param evaluated/assigned)
593600
root = view.data;
594601
}
595602
items = path;
596603
items.push(origRoot);
604+
cbItemCount = items.length;
597605
} else {
598606
if (!$isFunction(path)) {
599607
if (path && path._cpfn) {

‎jquery.observable.min.js

+2-2
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

+12-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*! jquery.views.js v0.9.87 (Beta): http://jsviews.com/ */
1+
/*! jquery.views.js v0.9.88 (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.87",
47+
var versionNumber = "v0.9.88",
4848
requiresStr = "JsViews requires ";
4949

5050
if (!$ || !$.fn) {
@@ -91,7 +91,7 @@ var document = global.document,
9191
if ($.link) { return $; } // JsViews is already loaded
9292

9393
$subSettings.trigger = true;
94-
var activeBody, rTagDatalink, $view, $viewsLinkAttr, linkViewsSel, wrapMap, viewStore, oldAdvSet,
94+
var activeBody, rTagDatalink, $view, $viewsLinkAttr, linkViewsSel, wrapMap, viewStore, oldAdvSet, useInput,
9595
jsvAttrStr = "data-jsv",
9696
elementChangeStr = "change.jsv",
9797
onBeforeChangeStr = "onBeforeChange",
@@ -986,10 +986,10 @@ function $link(tmplOrLinkExpr, to, from, context, noIteration, parentView, prevN
986986

987987
if (!activeBody) {
988988
activeBody = document.body;
989+
useInput = "oninput" in activeBody;
989990
$(activeBody)
990991
.on(elementChangeStr, onElemChange)
991-
.on('input', 'input[type="number"]', onElemChange)
992-
.on('blur', '[contenteditable]', onElemChange);
992+
.on('blur.jsv', '[contenteditable]', onElemChange);
993993
}
994994

995995
var i, k, html, vwInfos, view, placeholderParent, targetEl, refresh, topLevelCall, late,
@@ -1716,11 +1716,11 @@ function addDataBinding(late, linkMarkup, node, currentView, boundTagId, isLink,
17161716
rTagIndex = rTagDatalink.lastIndex;
17171717
attr = tokens[1];
17181718
tagExpr = tokens[3];
1719-
while (linkExpressions[0] && linkExpressions[0][4] === "else") { // If this is {someTag...} and is followed by an {else...} add to tagExpr
1719+
while (linkExpressions[0] && linkExpressions[0][4] === "else") { // If this is {sometag...} and is followed by an {else...} add to tagExpr
17201720
tagExpr += delimCloseChar1 + delimOpenChar0 + linkExpressions.shift()[3];
17211721
hasElse = true;
17221722
}
1723-
if (hasElse) { // If an {else} has been added, need also to add closing {{/someTag}}
1723+
if (hasElse) { // If an {else} has been added, need also to add closing {{/sometag}}
17241724
tagExpr += delimCloseChar1 + delimOpenChar0 + delimOpenChar1 + "/" + tokens[4] + delimCloseChar0;
17251725
}
17261726
linkCtx = {
@@ -1948,7 +1948,10 @@ function asyncOnElemChange(ev) {
19481948
function bindTriggerEvent($elem, trig, onoff) {
19491949
// Bind keydown, or other trigger - (rather than use the default change event bubbled to activeBody)
19501950
if (trig) {
1951-
trig = "" + trig === trig ? trig : "keydown"; // Set trigger to (true || truey non-string (e.g. 1) || 'keydown')
1951+
if (useInput) {
1952+
$elem[onoff]("input.jsv", onElemChange); // For HTML5 browser with "oninput" support - for mouse editing of text
1953+
}
1954+
trig = "" + trig === trig ? trig : "keydown.jsv"; // Set trigger to (true || truey non-string (e.g. 1) || 'keydown')
19521955
$elem[onoff](trig, trig.indexOf("keydown") >= 0 ? asyncOnElemChange : onElemChange); // Get 'keydown' with async
19531956
}
19541957
}
@@ -2247,8 +2250,7 @@ function $unlink(to) {
22472250
if (activeBody) {
22482251
$(activeBody)
22492252
.off(elementChangeStr, onElemChange)
2250-
.off('input', 'input[type="number"]', onElemChange)
2251-
.off('blur', '[contenteditable]', onElemChange);
2253+
.off('blur.jsv', '[contenteditable]', onElemChange);
22522254
activeBody = undefined;
22532255
}
22542256
topView.removeViews();

‎jquery.views.min.js

+3-3
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

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*! JsRender v0.9.87 (Beta): http://jsviews.com/#jsrender */
1+
/*! JsRender v0.9.88 (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.87",
47+
var versionNumber = "v0.9.88",
4848
jsvStoreName, rTag, rTmplString, topView, $views, $expando,
4949
_ocp = "_ocp", // Observable contextual parameter
5050

@@ -1571,7 +1571,7 @@ function renderWithViews(tmpl, data, context, noIteration, view, key, onRender,
15711571
result += newView._.onRender ? newView._.onRender(itemResult, childView) : itemResult;
15721572
}
15731573
} else {
1574-
// Create a view for singleton data object. The type of the view will be the tag name, e.g. "if" or "myTag" except for
1574+
// Create a view for singleton data object. The type of the view will be the tag name, e.g. "if" or "mytag" except for
15751575
// "item", "array" and "data" views. A "data" view is from programmatic render(object) against a 'singleton'.
15761576
if (itemVar) {
15771577
setItemVar(data);

‎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.

‎jsviews.js

+23-13
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*! jsviews.js v0.9.87 (Beta) single-file version: http://jsviews.com/ */
1+
/*! jsviews.js v0.9.88 (Beta) single-file version: http://jsviews.com/ */
22
/*! includes JsRender, JsObservable and JsViews - see: http://jsviews.com/#download */
33

44
/* Interactive data-driven views using JsRender templates */
@@ -47,7 +47,7 @@ if (!$ || !$.fn) {
4747
throw "JsViews requires jQuery"; // We require jQuery
4848
}
4949

50-
var versionNumber = "v0.9.87",
50+
var versionNumber = "v0.9.88",
5151

5252
jsvStoreName, rTag, rTmplString, topView, $views, $observe, $observable, $expando,
5353
_ocp = "_ocp", // Observable contextual parameter
@@ -1575,7 +1575,7 @@ function renderWithViews(tmpl, data, context, noIteration, view, key, onRender,
15751575
result += newView._.onRender ? newView._.onRender(itemResult, childView) : itemResult;
15761576
}
15771577
} else {
1578-
// Create a view for singleton data object. The type of the view will be the tag name, e.g. "if" or "myTag" except for
1578+
// Create a view for singleton data object. The type of the view will be the tag name, e.g. "if" or "mytag" except for
15791579
// "item", "array" and "data" views. A "data" view is from programmatic render(object) against a 'singleton'.
15801580
if (itemVar) {
15811581
setItemVar(data);
@@ -2889,7 +2889,7 @@ if (!$.observe) {
28892889
}
28902890

28912891
var i, p, skip, parts, prop, path, dep, unobserve, callback, cbId, inId, el, data, events, contextCb, innerContextCb,
2892-
items, cbBindings, depth, innerCb, parentObs, allPath, filter, initNsArr, initNsArrLen, view,
2892+
items, cbBindings, depth, innerCb, parentObs, allPath, filter, initNsArr, initNsArrLen, view, cbItemCount,
28932893
ns = observeStr,
28942894
paths = this != 1 // Using != for IE<10 bug- see jsviews/issues/237
28952895
? concat.apply([], arguments) // Flatten the arguments - this is a 'recursive call' with params using the 'wrapped array'
@@ -2967,7 +2967,14 @@ if (!$.observe) {
29672967
}
29682968
}
29692969
depth = 0;
2970+
cbItemCount = 0;
29702971
for (i = 0; i < l; i++) {
2972+
if (cbItemCount) {
2973+
cbItemCount--; // contextCb was moved to a contextual parameter outer context. Needs to revert after cbItemCount
2974+
} else {
2975+
contextCb = innerContextCb;
2976+
}
2977+
29712978
path = paths[i];
29722979
if (path === "" || path === root) {
29732980
continue;
@@ -3002,14 +3009,15 @@ if (!$.observe) {
30023009
} else if (path && path._cxp) { // contextual parameter
30033010
view = path.shift(); // Contextual data
30043011
if (_ocp in view) {
3005-
root = view;
3012+
root = view; // observable contextual parameter
30063013
contextCb = 0;
30073014
} else {
30083015
contextCb = $sub._gccb(view); // getContextCb: Get context callback for the contextual view (where contextual param evaluated/assigned)
30093016
root = view.data;
30103017
}
30113018
items = path;
30123019
items.push(origRoot);
3020+
cbItemCount = items.length;
30133021
} else {
30143022
if (!$isFunction(path)) {
30153023
if (path && path._cpfn) {
@@ -3575,7 +3583,7 @@ rFirstElem = /<(?!script)(\w+)[>\s]/;
35753583
if ($.link) { return $; } // JsViews is already loaded
35763584

35773585
$subSettings.trigger = true;
3578-
var activeBody, rTagDatalink, $view, $viewsLinkAttr, linkViewsSel, wrapMap, viewStore, oldAdvSet,
3586+
var activeBody, rTagDatalink, $view, $viewsLinkAttr, linkViewsSel, wrapMap, viewStore, oldAdvSet, useInput,
35793587
jsvAttrStr = "data-jsv",
35803588
elementChangeStr = "change.jsv",
35813589
onBeforeChangeStr = "onBeforeChange",
@@ -4470,10 +4478,10 @@ function $link(tmplOrLinkExpr, to, from, context, noIteration, parentView, prevN
44704478

44714479
if (!activeBody) {
44724480
activeBody = document.body;
4481+
useInput = "oninput" in activeBody;
44734482
$(activeBody)
44744483
.on(elementChangeStr, onElemChange)
4475-
.on('input', 'input[type="number"]', onElemChange)
4476-
.on('blur', '[contenteditable]', onElemChange);
4484+
.on('blur.jsv', '[contenteditable]', onElemChange);
44774485
}
44784486

44794487
var i, k, html, vwInfos, view, placeholderParent, targetEl, refresh, topLevelCall, late,
@@ -5200,11 +5208,11 @@ function addDataBinding(late, linkMarkup, node, currentView, boundTagId, isLink,
52005208
rTagIndex = rTagDatalink.lastIndex;
52015209
attr = tokens[1];
52025210
tagExpr = tokens[3];
5203-
while (linkExpressions[0] && linkExpressions[0][4] === "else") { // If this is {someTag...} and is followed by an {else...} add to tagExpr
5211+
while (linkExpressions[0] && linkExpressions[0][4] === "else") { // If this is {sometag...} and is followed by an {else...} add to tagExpr
52045212
tagExpr += delimCloseChar1 + delimOpenChar0 + linkExpressions.shift()[3];
52055213
hasElse = true;
52065214
}
5207-
if (hasElse) { // If an {else} has been added, need also to add closing {{/someTag}}
5215+
if (hasElse) { // If an {else} has been added, need also to add closing {{/sometag}}
52085216
tagExpr += delimCloseChar1 + delimOpenChar0 + delimOpenChar1 + "/" + tokens[4] + delimCloseChar0;
52095217
}
52105218
linkCtx = {
@@ -5432,7 +5440,10 @@ function asyncOnElemChange(ev) {
54325440
function bindTriggerEvent($elem, trig, onoff) {
54335441
// Bind keydown, or other trigger - (rather than use the default change event bubbled to activeBody)
54345442
if (trig) {
5435-
trig = "" + trig === trig ? trig : "keydown"; // Set trigger to (true || truey non-string (e.g. 1) || 'keydown')
5443+
if (useInput) {
5444+
$elem[onoff]("input.jsv", onElemChange); // For HTML5 browser with "oninput" support - for mouse editing of text
5445+
}
5446+
trig = "" + trig === trig ? trig : "keydown.jsv"; // Set trigger to (true || truey non-string (e.g. 1) || 'keydown')
54365447
$elem[onoff](trig, trig.indexOf("keydown") >= 0 ? asyncOnElemChange : onElemChange); // Get 'keydown' with async
54375448
}
54385449
}
@@ -5731,8 +5742,7 @@ function $unlink(to) {
57315742
if (activeBody) {
57325743
$(activeBody)
57335744
.off(elementChangeStr, onElemChange)
5734-
.off('input', 'input[type="number"]', onElemChange)
5735-
.off('blur', '[contenteditable]', onElemChange);
5745+
.off('blur.jsv', '[contenteditable]', onElemChange);
57365746
activeBody = undefined;
57375747
}
57385748
topView.removeViews();

‎jsviews.min.js

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

‎jsviews.min.js.map

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

‎package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "jsviews",
3-
"version": "v0.9.87",
3+
"version": "v0.9.88",
44
"description": "Next-generation MVVM and MVP framework - built on top of JsRender templates. Bringing templates to life...",
55
"main": "./jsviews.js",
66
"author": {
@@ -35,7 +35,7 @@
3535
"glob-stream": "^5.0.0",
3636
"gulp": "^3.9.0",
3737
"jquery": "^2.1.4",
38-
"jsrender": "^0.9.86",
38+
"jsrender": "^0.9.88",
3939
"qunit": "^0.7.6"
4040
},
4141
"dependencies": {}

‎test/browserify/bundles/1-bundle.js

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

0 commit comments

Comments
 (0)
Please sign in to comment.