knockoutjs-rails 1.03 → 1.04
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -1
- data/lib/knockoutjs-rails/version.rb +1 -1
- data/vendor/assets/javascripts/knockout.js +95 -11
- metadata +3 -3
data/README.md
CHANGED
@@ -20,7 +20,7 @@ Add the following directive to your Javascript manifest file (application.js):
|
|
20
20
|
|
21
21
|
## Versioning
|
22
22
|
|
23
|
-
knockoutjs-rails 1.
|
23
|
+
knockoutjs-rails 1.04 == Knockout.js 1.04
|
24
24
|
|
25
25
|
Every attempt is made to mirror the currently shipping Knockout.js version number wherever possible.
|
26
26
|
The major and minor version numbers will always represent the Knockout.js version, but the patch level
|
@@ -1,4 +1,4 @@
|
|
1
|
-
// Knockout JavaScript library v1.
|
1
|
+
// Knockout JavaScript library v1.04
|
2
2
|
// (c) 2010 Steven Sanderson - http://knockoutjs.com/
|
3
3
|
// License: Ms-Pl (http://www.opensource.org/licenses/ms-pl.html)
|
4
4
|
|
@@ -7,8 +7,10 @@ var ko = window.ko = {};
|
|
7
7
|
|
8
8
|
ko.utils = new (function () {
|
9
9
|
var stringTrimRegex = /^(\s|\u00A0)+|(\s|\u00A0)+$/g;
|
10
|
-
|
10
|
+
|
11
11
|
return {
|
12
|
+
fieldsIncludedWithJsonPost: ['authenticity_token', /^__RequestVerificationToken(_.*)?$/],
|
13
|
+
|
12
14
|
arrayForEach: function (array, action) {
|
13
15
|
for (var i = 0, j = array.length; i < j; i++)
|
14
16
|
action(array[i]);
|
@@ -219,6 +221,27 @@ ko.utils = new (function () {
|
|
219
221
|
result.push(i);
|
220
222
|
return result;
|
221
223
|
},
|
224
|
+
|
225
|
+
makeArray: function(arrayLikeObject) {
|
226
|
+
var result = [];
|
227
|
+
for (var i = arrayLikeObject.length - 1; i >= 0; i--){
|
228
|
+
result.push(arrayLikeObject[i]);
|
229
|
+
};
|
230
|
+
return result;
|
231
|
+
},
|
232
|
+
|
233
|
+
getFormFields: function(form, fieldName) {
|
234
|
+
var fields = ko.utils.makeArray(form.getElementsByTagName("INPUT")).concat(ko.utils.makeArray(form.getElementsByTagName("TEXTAREA")));
|
235
|
+
var isMatchingField = (typeof fieldName == 'string')
|
236
|
+
? function(field) { return field.name === fieldName }
|
237
|
+
: function(field) { return fieldName.test(field.name) }; // Treat fieldName as regex or object containing predicate
|
238
|
+
var matches = [];
|
239
|
+
for (var i = fields.length - 1; i >= 0; i--) {
|
240
|
+
if (isMatchingField(fields[i]))
|
241
|
+
matches.push(fields[i]);
|
242
|
+
};
|
243
|
+
return matches;
|
244
|
+
},
|
222
245
|
|
223
246
|
stringifyJson: function (data) {
|
224
247
|
if ((typeof JSON == "undefined") || (typeof JSON.stringify == "undefined"))
|
@@ -226,7 +249,23 @@ ko.utils = new (function () {
|
|
226
249
|
return JSON.stringify(ko.utils.unwrapObservable(data));
|
227
250
|
},
|
228
251
|
|
229
|
-
postJson: function (
|
252
|
+
postJson: function (urlOrForm, data, options) {
|
253
|
+
options = options || {};
|
254
|
+
var params = options.params || {};
|
255
|
+
var includeFields = options.includeFields || this.fieldsIncludedWithJsonPost;
|
256
|
+
var url = urlOrForm;
|
257
|
+
|
258
|
+
// If we were given a form, use its 'action' URL and pick out any requested field values
|
259
|
+
if((typeof urlOrForm == 'object') && (urlOrForm.tagName == "FORM")) {
|
260
|
+
var originalForm = urlOrForm;
|
261
|
+
url = originalForm.action;
|
262
|
+
for (var i = includeFields.length - 1; i >= 0; i--) {
|
263
|
+
var fields = ko.utils.getFormFields(originalForm, includeFields[i]);
|
264
|
+
for (var j = fields.length - 1; j >= 0; j--)
|
265
|
+
params[fields[j].name] = fields[j].value;
|
266
|
+
}
|
267
|
+
}
|
268
|
+
|
230
269
|
data = ko.utils.unwrapObservable(data);
|
231
270
|
var form = document.createElement("FORM");
|
232
271
|
form.style.display = "none";
|
@@ -238,8 +277,14 @@ ko.utils = new (function () {
|
|
238
277
|
input.value = ko.utils.stringifyJson(ko.utils.unwrapObservable(data[key]));
|
239
278
|
form.appendChild(input);
|
240
279
|
}
|
280
|
+
for (var key in params) {
|
281
|
+
var input = document.createElement("INPUT");
|
282
|
+
input.name = key;
|
283
|
+
input.value = params[key];
|
284
|
+
form.appendChild(input);
|
285
|
+
}
|
241
286
|
document.body.appendChild(form);
|
242
|
-
form.submit();
|
287
|
+
options.submitter ? options.submitter(form) : form.submit();
|
243
288
|
setTimeout(function () { form.parentNode.removeChild(form); }, 0);
|
244
289
|
},
|
245
290
|
|
@@ -482,6 +527,25 @@ ko.observableArray = function (initialValues) {
|
|
482
527
|
return ko.utils.arrayIndexOf(arrayOfValues, value) >= 0;
|
483
528
|
});
|
484
529
|
};
|
530
|
+
|
531
|
+
result.destroy = function (valueOrPredicate) {
|
532
|
+
var underlyingArray = result();
|
533
|
+
var predicate = typeof valueOrPredicate == "function" ? valueOrPredicate : function (value) { return value === valueOrPredicate; };
|
534
|
+
for (var i = underlyingArray.length - 1; i >= 0; i--) {
|
535
|
+
var value = underlyingArray[i];
|
536
|
+
if (predicate(value))
|
537
|
+
underlyingArray[i]._destroy = true;
|
538
|
+
}
|
539
|
+
result.valueHasMutated();
|
540
|
+
};
|
541
|
+
|
542
|
+
result.destroyAll = function (arrayOfValues) {
|
543
|
+
if (!arrayOfValues)
|
544
|
+
return [];
|
545
|
+
return result.destroy(function (value) {
|
546
|
+
return ko.utils.arrayIndexOf(arrayOfValues, value) >= 0;
|
547
|
+
});
|
548
|
+
};
|
485
549
|
|
486
550
|
result.indexOf = function (item) {
|
487
551
|
var underlyingArray = result();
|
@@ -715,7 +779,7 @@ ko.bindingHandlers.submit = {
|
|
715
779
|
if (typeof value != "function")
|
716
780
|
throw new Error("The value for a submit binding must be a function to invoke on submit");
|
717
781
|
ko.utils.registerEventHandler(element, "submit", function (event) {
|
718
|
-
try { value.call(viewModel); }
|
782
|
+
try { value.call(viewModel, element); }
|
719
783
|
finally {
|
720
784
|
if (event.preventDefault)
|
721
785
|
event.preventDefault();
|
@@ -1058,7 +1122,12 @@ ko.templateRewriting = (function () {
|
|
1058
1122
|
if (typeof unwrappedArray.length == "undefined") // Coerce single value into array
|
1059
1123
|
unwrappedArray = [unwrappedArray];
|
1060
1124
|
|
1061
|
-
|
1125
|
+
// Filter out any entries marked as destroyed
|
1126
|
+
var filteredArray = ko.utils.arrayFilter(unwrappedArray, function(item) {
|
1127
|
+
return options.includeDestroyed || !item._destroy;
|
1128
|
+
});
|
1129
|
+
|
1130
|
+
ko.utils.setDomNodeChildrenFromArrayMapping(targetNode, filteredArray, function (arrayValue) {
|
1062
1131
|
return executeTemplate(null, "ignoreTargetNode", template, arrayValue, options);
|
1063
1132
|
}, options);
|
1064
1133
|
}, null, { disposeWhen: whenToDispose });
|
@@ -1070,7 +1139,7 @@ ko.templateRewriting = (function () {
|
|
1070
1139
|
|
1071
1140
|
if (typeof bindingValue.foreach != "undefined") {
|
1072
1141
|
// Render once for each data point
|
1073
|
-
ko.renderTemplateForEach(templateName, bindingValue.foreach || [], { afterAdd: bindingValue.afterAdd, beforeRemove: bindingValue.beforeRemove }, element);
|
1142
|
+
ko.renderTemplateForEach(templateName, bindingValue.foreach || [], { afterAdd: bindingValue.afterAdd, beforeRemove: bindingValue.beforeRemove, includeDestroyed: bindingValue.includeDestroyed }, element);
|
1074
1143
|
}
|
1075
1144
|
else {
|
1076
1145
|
// Render once for this single data point (or use the viewModel if no data was provided)
|
@@ -1262,14 +1331,17 @@ ko.jqueryTmplTemplateEngine = function () {
|
|
1262
1331
|
return templateNode;
|
1263
1332
|
}
|
1264
1333
|
|
1334
|
+
var aposMarker = "__ko_apos__";
|
1335
|
+
var aposRegex = new RegExp(aposMarker, "g");
|
1265
1336
|
this.renderTemplate = function (template, data, options) {
|
1266
1337
|
// jquery.tmpl doesn't like it if the template returns just text content or nothing - it only likes you to return DOM nodes.
|
1267
1338
|
// To make things more flexible, we can wrap the whole template in a <script> node so that jquery.tmpl just processes it as
|
1268
1339
|
// text and doesn't try to parse the output. Then, since jquery.tmpl has jQuery as a dependency anyway, we can use jQuery to
|
1269
|
-
// parse that text into a document fragment using jQuery.clean().
|
1270
|
-
var templateTextInWrapper = "<script type=\"text/html\">" +
|
1340
|
+
// parse that text into a document fragment using jQuery.clean().
|
1341
|
+
var templateTextInWrapper = "<script type=\"text/html\">" + getTemplateNode(template).text + "</script>";
|
1271
1342
|
var renderedMarkupInWrapper = $.tmpl(templateTextInWrapper, data);
|
1272
|
-
|
1343
|
+
var renderedMarkup = renderedMarkupInWrapper[0].text.replace(aposRegex, "'");
|
1344
|
+
return jQuery.clean([renderedMarkup], document);
|
1273
1345
|
},
|
1274
1346
|
|
1275
1347
|
this.isTemplateRewritten = function (template) {
|
@@ -1278,7 +1350,19 @@ ko.jqueryTmplTemplateEngine = function () {
|
|
1278
1350
|
|
1279
1351
|
this.rewriteTemplate = function (template, rewriterCallback) {
|
1280
1352
|
var templateNode = getTemplateNode(template);
|
1281
|
-
var rewritten = rewriterCallback(templateNode.text)
|
1353
|
+
var rewritten = rewriterCallback(templateNode.text);
|
1354
|
+
|
1355
|
+
// jquery.tmpl falls over if you use single-quotes, so replace these with a temporary marker for template rendering,
|
1356
|
+
// and then replace back after the template was rendered. This is slightly complicated by the fact that we must not interfere
|
1357
|
+
// with any code blocks - only replace apos characters outside code blocks.
|
1358
|
+
rewritten = ko.utils.stringTrim(rewritten);
|
1359
|
+
rewritten = rewritten.replace(/([\s\S]*?)(\${[\s\S]*?}|{{[\=a-z][\s\S]*?}}|$)/g, function(match) {
|
1360
|
+
// Called for each non-code-block followed by a code block (or end of template)
|
1361
|
+
var nonCodeSnippet = arguments[1];
|
1362
|
+
var codeSnippet = arguments[2];
|
1363
|
+
return nonCodeSnippet.replace(/\'/g, aposMarker) + codeSnippet;
|
1364
|
+
});
|
1365
|
+
|
1282
1366
|
templateNode.text = rewritten;
|
1283
1367
|
templateNode.isRewritten = true;
|
1284
1368
|
},
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knockoutjs-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '1.
|
4
|
+
version: '1.04'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-01-28 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: railties
|
16
|
-
requirement: &
|
16
|
+
requirement: &70158057167200 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '3.1'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70158057167200
|
25
25
|
description: Knockout is a JavaScript library that helps you to create rich, responsive
|
26
26
|
display and editor user interfaces with a clean underlying data model
|
27
27
|
email:
|