Skip to content

Instantly share code, notes, and snippets.

@joelnet
Created June 3, 2011 18:03
Show Gist options
  • Select an option

  • Save joelnet/1006808 to your computer and use it in GitHub Desktop.

Select an option

Save joelnet/1006808 to your computer and use it in GitHub Desktop.
Unobtrusive Knockout support library for jQuery
Choose a ticket class: <select id="tickets"></select>
<p id="ticketOutput"></p>
<script id="ticketTemplate" type="text/x-jquery-tmpl">
{{if chosenTicket}}
You have chosen <b>${ chosenTicket().name }</b>
($${ chosenTicket().price })
<button data-bind="click: resetTicket">Clear</button>
{{/if}}
</script>
<script type="text/javascript">
var viewModel = {
tickets: [
{ name: "Economy", price: 199.95 },
{ name: "Business", price: 449.22 },
{ name: "First Class", price: 1199.99 }
],
chosenTicket: ko.observable(),
resetTicket: function() { this.chosenTicket(null) }
};
$("#tickets").dataBind({
options: "tickets",
optionsCaption: "'Choose...'",
optionsText: "'name'",
value: "chosenTicket"
});
$("#ticketOutput").dataBind({ template: "'ticketTemplate'" });
ko.applyBindings(viewModel);
</script>
/**
* @preserve Unobtrusive Knockout support library for jQuery
*
* @author Joel Thoms
* @version 1.1
*/
(function($) {
if (!$ || !$['fn']) throw new Error('jQuery library is required.');
/**
* Private method to recursively render key value pairs into a string
*
* @param {Object} options Object to render into a string.
* @return {string} The string value of the object passed in.
*/
function render(options) {
var rendered = [];
for (var key in options) {
var val = options[key];
switch (typeof val) {
case 'string': rendered.push(key + ':' + val); break;
case 'object': rendered.push(key + ':{' + render(val) + '}'); break;
case 'function': rendered.push(key + ':' + val.toString()); break;
}
}
return rendered.join(',');
}
/**
* jQuery extension to handle unobtrusive Knockout data binding.
*
* @param {Object} options Object to render into a string.
* @return {Object} A jQuery object.
*/
$['fn']['dataBind'] = $['fn']['dataBind'] || function(options) {
return this['each'](function() {
var opts = $.extend({}, $['fn']['dataBind']['defaults'], options);
var attr = render(opts);
if (attr != null && attr != '') {
$(this)['attr']('data-bind', attr);
}
});
};
})(jQuery);
/*
Unobtrusive Knockout support library for jQuery
@author Joel Thoms
@version 1.1
*/
(function(a){function e(a){var b=[],c;for(c in a){var d=a[c];switch(typeof d){case "string":b.push(c+":"+d);break;case "object":b.push(c+":{"+e(d)+"}");break;case "function":b.push(c+":"+d.toString())}}return b.join(",")}if(!a||!a.fn)throw Error("jQuery library is required.");a.fn.dataBind=a.fn.dataBind||function(f){return this.each(function(){var b=a.extend({},a.fn.dataBind.defaults,f),b=e(b);b!=null&&b!=""&&a(this).attr("data-bind",b)})}})(jQuery);
@jwize

jwize commented May 23, 2012 via email

Copy link
Copy Markdown

@jwize

jwize commented May 23, 2012 via email

Copy link
Copy Markdown

@jwize

jwize commented May 24, 2012 via email

Copy link
Copy Markdown

@joelnet

joelnet commented May 24, 2012

Copy link
Copy Markdown
Author

what isn't working? what is "fullName"? Is that a text field? if so, I don't believe "load" is a valid event. Can you use chrome's element inspector to look inside "fullName" to see what the data-bind attribute generated is?

http://www.threetipsaday.com/2008/12/debug-inspect-google-chrome-inspector/

@jwize

jwize commented May 24, 2012 via email

Copy link
Copy Markdown

@joelnet

joelnet commented May 24, 2012

Copy link
Copy Markdown
Author

I don't believe the $(this) part will work. use the element inspector and you'll see why. The function get's converted into a string and will lose the "this" context.

@jwize

jwize commented May 24, 2012 via email

Copy link
Copy Markdown

@unirgy

unirgy commented Jun 26, 2013

Copy link
Copy Markdown

I think there's an inconsistency: instead of $.extend() need to use $['extend']() /sarcasm.

Is there a reason for this notation?

@joelnet

joelnet commented Sep 13, 2016

Copy link
Copy Markdown
Author

@unirgy, there is no valid reason for that notation. I would do this differently today. Not sure what the reason was way back then.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment