Skip to content

Commit

Permalink
Added validators.
Browse files Browse the repository at this point in the history
  • Loading branch information
Kevin Malakoff committed Sep 11, 2012
1 parent 8ea9e20 commit 95c4074
Show file tree
Hide file tree
Showing 40 changed files with 2,167 additions and 235 deletions.
23 changes: 19 additions & 4 deletions Bakefile.coffee
Expand Up @@ -17,6 +17,7 @@ module.exports =
'src/knockback-formatting/knockback-formatted-observable.coffee'
'src/knockback-localization/knockback-localized-observable.coffee'
'src/knockback-triggering/knockback-triggered-observable.coffee'
'src/knockback-validation/knockback-validators.coffee'
]

knockback_core:
Expand Down Expand Up @@ -77,6 +78,16 @@ module.exports =
'src/knockback-triggering/knockback-triggered-observable.coffee'
]

knockback_validation:
join: 'knockback-validation.js'
wrapper: 'src/knockback-loader.js'
output: 'lib'
compress: true
files: [
'src/component-imports.coffee'
'src/knockback-validation/knockback-validators.coffee'
]

knockback_statistics:
join: 'knockback-statistics.js'
output: 'lib'
Expand Down Expand Up @@ -150,10 +161,12 @@ module.exports =
'cp lib/knockback-defaults.min.js packages/npm/lib/knockback-defaults.min.js'
'cp lib/knockback-formatting.js packages/npm/lib/knockback-formatting.js'
'cp lib/knockback-formatting.min.js packages/npm/lib/knockback-formatting.min.js'
'cp lib/knockback-triggering.js packages/npm/lib/knockback-triggering.js'
'cp lib/knockback-triggering.min.js packages/npm/lib/knockback-triggering.min.js'
'cp lib/knockback-localization.js packages/npm/lib/knockback-localization.js'
'cp lib/knockback-localization.min.js packages/npm/lib/knockback-localization.min.js'
'cp lib/knockback-triggering.js packages/npm/lib/knockback-triggering.js'
'cp lib/knockback-triggering.min.js packages/npm/lib/knockback-triggering.min.js'
'cp lib/knockback-validation.js packages/npm/lib/knockback-validation.js'
'cp lib/knockback-validation.min.js packages/npm/lib/knockback-validation.min.js'
'cp lib/knockback-statistics.js packages/npm/lib/knockback-statistics.js'
'cp lib/knockback-statistics.min.js packages/npm/lib/knockback-statistics.min.js'

Expand All @@ -173,10 +186,10 @@ module.exports =
'cp lib/knockback-defaults.min.js packages/nuget/Content/Scripts/lib/knockback-defaults.min.js'
'cp lib/knockback-formatting.js packages/nuget/Content/Scripts/lib/knockback-formatting.js'
'cp lib/knockback-formatting.min.js packages/nuget/Content/Scripts/lib/knockback-formatting.min.js'
'cp lib/knockback-triggering.js packages/nuget/Content/Scripts/lib/knockback-triggering.js'
'cp lib/knockback-triggering.min.js packages/nuget/Content/Scripts/lib/knockback-triggering.min.js'
'cp lib/knockback-localization.js packages/nuget/Content/Scripts/lib/knockback-localization.js'
'cp lib/knockback-localization.min.js packages/nuget/Content/Scripts/lib/knockback-localization.min.js'
'cp lib/knockback-validation.js packages/nuget/Content/Scripts/lib/knockback-validation.js'
'cp lib/knockback-validation.min.js packages/nuget/Content/Scripts/lib/knockback-validation.min.js'
'cp lib/knockback-statistics.js packages/nuget/Content/Scripts/lib/knockback-statistics.js'
'cp lib/knockback-statistics.min.js packages/nuget/Content/Scripts/lib/knockback-statistics.min.js'
]
Expand All @@ -199,6 +212,7 @@ module.exports =
'test/knockback-formatting'
'test/knockback-localization'
'test/knockback-triggering'
'test/knockback-validation'

'test/deprecated'
]
Expand Down Expand Up @@ -226,6 +240,7 @@ module.exports =
'test/knockback-formatting'
'test/knockback-localization'
'test/knockback-triggering'
'test/knockback-validation'

'test/deprecated'
'test/full-stack'
Expand Down
7 changes: 7 additions & 0 deletions RELEASE_NOTES.md
Expand Up @@ -4,6 +4,13 @@ Please refer to the following release notes when upgrading your version of Knock

* **major changes to kb.CollectionObservable**: added support for observable mappings (sort_attribute, sorted_index_fn and filters), removed defer, removed optional collection reference counting, removed Backbone.Events (use ko.subscription instead, removed wrappedObject in the collection).

* **added app and view_model injection**: you are now able to inject an application using a kb-app attribute on a dom element and inject into a view model using an 'inject' data-bind attribute.

* **added validators**: you can use kb.valueValidator, kb.inputValidator, or kb.formValidator to add validations. Currently only the following are support: 'required', 'url', 'number', 'email' and you can extend by adding properties to kb.validators

### Deprecations

* **ko.renderAutoReleasedTemplate replaced by kb.renderTemplate**

## 0.16.1

Expand Down
58 changes: 44 additions & 14 deletions knockback-core-stack.js
Expand Up @@ -6042,7 +6042,7 @@ kb = (function() {
});
};

kb.renderAutoReleasedTemplate = function(template, view_model, options) {
kb.renderTemplate = function(template, view_model, options) {
var el, observable;
if (options == null) {
options = {};
Expand All @@ -6057,6 +6057,14 @@ kb = (function() {
return el;
};

kb.renderAutoReleasedTemplate = function(template, view_model, options) {
if (options == null) {
options = {};
}
legacyWarning('kb.renderAutoReleasedTemplate', '0.16.2', 'Please use kb.renderTemplate instead');
return this.renderTemplate(template, view_model, options = {});
};

kb.applyBindings = function(view_model, node) {
ko.applyBindings(view_model, node);
return kb.releaseOnNodeRemove(view_model, node);
Expand Down Expand Up @@ -7621,29 +7629,40 @@ kb.sortedIndexWrapAttr = kb.siwa = function(attribute_name, wrapper_constructor)
*/


ko.bindingHandlers['kb-inject'] = {
ko.bindingHandlers['inject'] = {
'init': function(element, value_accessor, all_bindings_accessor, view_model) {
var data;
var data, wrapper;
data = ko.utils.unwrapObservable(value_accessor());
return ko.computed(function() {
wrapper = ko.dependentObservable(function() {
var key, value, _results;
if (_.isFunction(data)) {
return data(view_model, element, value_accessor, all_bindings_accessor);
} else if (_.isObject(data)) {
return _.extend(view_model, data);
_results = [];
for (key in data) {
value = data[key];
if (_.isObject(value) && value.resolve && _.isFunction(value.resolve)) {
_results.push(view_model[key] = value.resolve(view_model, element, value_accessor, all_bindings_accessor));
} else {
_results.push(view_model[key] = value);
}
}
return _results;
}
});
return wrapper.dispose();
}
};

kb.injectApps = function(root) {
var app_el, app_els, getAppElements, _i, _len;
app_els = [];
var app, apps, getAppElements, options, _i, _len;
apps = [];
getAppElements = function(el) {
var child_el, _i, _len, _ref;
if (el.attributes && _.find(el.attributes, function(attr) {
var attr, child_el, _i, _len, _ref;
if (el.attributes && (attr = _.find(el.attributes, function(attr) {
return attr.name === 'kb-app';
})) {
app_els.push(el);
}))) {
apps.push([el, attr]);
}
_ref = el.childNodes;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
Expand All @@ -7652,9 +7671,20 @@ kb.injectApps = function(root) {
}
};
getAppElements(root || document);
for (_i = 0, _len = app_els.length; _i < _len; _i++) {
app_el = app_els[_i];
kb.applyBindings({}, app_el);
for (_i = 0, _len = apps.length; _i < _len; _i++) {
app = apps[_i];
if (app[1].value) {
options = ko.utils.buildEvalWithinScopeFunction("{" + app[1].value + "}", 0)();
}
options || (options = {});
options.view_model || (options.view_model = {});
if (options.beforeBinding) {
options.beforeBinding(options.view_model, app[0], options);
}
kb.applyBindings(options.view_model, app[0], {});
if (options.afterBinding) {
options.afterBinding(options.view_model, app[0], options);
}
}
};

Expand Down
2 changes: 1 addition & 1 deletion knockback-core-stack.min.js

Large diffs are not rendered by default.

58 changes: 44 additions & 14 deletions knockback-core.js
Expand Up @@ -109,7 +109,7 @@ kb = (function() {
});
};

kb.renderAutoReleasedTemplate = function(template, view_model, options) {
kb.renderTemplate = function(template, view_model, options) {
var el, observable;
if (options == null) {
options = {};
Expand All @@ -124,6 +124,14 @@ kb = (function() {
return el;
};

kb.renderAutoReleasedTemplate = function(template, view_model, options) {
if (options == null) {
options = {};
}
legacyWarning('kb.renderAutoReleasedTemplate', '0.16.2', 'Please use kb.renderTemplate instead');
return this.renderTemplate(template, view_model, options = {});
};

kb.applyBindings = function(view_model, node) {
ko.applyBindings(view_model, node);
return kb.releaseOnNodeRemove(view_model, node);
Expand Down Expand Up @@ -1688,29 +1696,40 @@ kb.sortedIndexWrapAttr = kb.siwa = function(attribute_name, wrapper_constructor)
*/


ko.bindingHandlers['kb-inject'] = {
ko.bindingHandlers['inject'] = {
'init': function(element, value_accessor, all_bindings_accessor, view_model) {
var data;
var data, wrapper;
data = ko.utils.unwrapObservable(value_accessor());
return ko.computed(function() {
wrapper = ko.dependentObservable(function() {
var key, value, _results;
if (_.isFunction(data)) {
return data(view_model, element, value_accessor, all_bindings_accessor);
} else if (_.isObject(data)) {
return _.extend(view_model, data);
_results = [];
for (key in data) {
value = data[key];
if (_.isObject(value) && value.resolve && _.isFunction(value.resolve)) {
_results.push(view_model[key] = value.resolve(view_model, element, value_accessor, all_bindings_accessor));
} else {
_results.push(view_model[key] = value);
}
}
return _results;
}
});
return wrapper.dispose();
}
};

kb.injectApps = function(root) {
var app_el, app_els, getAppElements, _i, _len;
app_els = [];
var app, apps, getAppElements, options, _i, _len;
apps = [];
getAppElements = function(el) {
var child_el, _i, _len, _ref;
if (el.attributes && _.find(el.attributes, function(attr) {
var attr, child_el, _i, _len, _ref;
if (el.attributes && (attr = _.find(el.attributes, function(attr) {
return attr.name === 'kb-app';
})) {
app_els.push(el);
}))) {
apps.push([el, attr]);
}
_ref = el.childNodes;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
Expand All @@ -1719,9 +1738,20 @@ kb.injectApps = function(root) {
}
};
getAppElements(root || document);
for (_i = 0, _len = app_els.length; _i < _len; _i++) {
app_el = app_els[_i];
kb.applyBindings({}, app_el);
for (_i = 0, _len = apps.length; _i < _len; _i++) {
app = apps[_i];
if (app[1].value) {
options = ko.utils.buildEvalWithinScopeFunction("{" + app[1].value + "}", 0)();
}
options || (options = {});
options.view_model || (options.view_model = {});
if (options.beforeBinding) {
options.beforeBinding(options.view_model, app[0], options);
}
kb.applyBindings(options.view_model, app[0], {});
if (options.afterBinding) {
options.afterBinding(options.view_model, app[0], options);
}
}
};

Expand Down
2 changes: 1 addition & 1 deletion knockback-core.min.js

Large diffs are not rendered by default.

0 comments on commit 95c4074

Please sign in to comment.