Skip to content

Instantly share code, notes, and snippets.

@osbornm
Created February 27, 2013 04:28
Show Gist options
  • Save osbornm/5045086 to your computer and use it in GitHub Desktop.
Save osbornm/5045086 to your computer and use it in GitHub Desktop.
<!-- Simple Binding -->
<input type="submit" value="OK" data-bind='widget: "button"' />
<!-- Complex Binding with options -->
<input id='search' data-bind='widget: { name: "autocomplete", options: { source: searchCompletions(), delay: 500 } }, value: searchString' />
ko.bindingHandlers.widget = {
update: function (element, valueAccessor, allBindingsAccessor) {
var widgetBindings = _getWidgetBindings(element, valueAccessor, allBindingsAccessor);
$(element)[widgetBindings.widgetName](widgetBindings.widgetOptions);
}
};
function _getWidgetBindings(element, valueAccessor, allBindingsAccessor) {
var value = valueAccessor(),
myBinding = ko.utils.unwrapObservable(value),
allBindings = allBindingsAccessor();
if (typeof (myBinding) === 'string') {
myBinding = { 'name': myBinding };
}
var widgetName = myBinding.name,
widgetOptions = myBinding.options;
// Sanity check: can't directly check that it's truly a _widget_, but
// can at least verify that it's a defined function on jQuery:
if (typeof $.fn[widgetName] !== 'function') {
throw new Error("widget binding doesn't recognize '" + widgetName + "' as jQuery UI widget");
}
// Sanity check: don't confuse KO's 'options' binding with jqueryui binding's 'options' property
if (allBindings.options && !widgetOptions && element.tagName !== 'SELECT') {
throw new Error("widget binding options should be specified like this:\ndata-bind='widget: {name:\"" + widgetName + "\", options:{...} }'");
}
return {
widgetName: widgetName,
widgetOptions: widgetOptions
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment