Unobstrusive KOjs binding provider
by g
HTML
<script src="https://github.com/downloads/SteveSanderson/knockout/knockout-1.3.0beta.js"></script>
<div>
<input id="name" type="text" />
</div>
<ul id="items">
<li><span class="id"></span> - <span class="name"></span></li>
</ul>
<!-- comment test -->
JavaScript
var viewModel = {
name: ko.observable('test'),
items: ko.observableArray([
{ id: 0, name: 'Windows' },
{ id: 1, name: 'Linux' },
{ id: 2, name: 'MacOS' }
])
};
var bindings = {
'#name': {
value: viewModel.name
},
'#items': {
foreach: viewModel.items
},
'#items span.name': {
_text: function(context){ return this.name + ' : ' + context.$parent.name(); }, // Template context
click: function(){
alert(this.name);
}
},
'#items span.id': "text: id" // Default binding parser
}
ko.unobstrusiveBindingProvider = function(allBindings) {
this.allBindings = allBindings;
this.defaultProvider = new ko.bindingProvider();
var selectors = [];
for(var selector in allBindings)
{
selectors.push(selector);
}
this.allSelectors = selectors.join(', ');
this.nodeHasBindings = function(node) {
if(node.nodeType != 1) { return false; }
return $(node).is(this.allSelectors);
};
this.parseBindings = function(bindings, bindingContext)
{
var parsedBindings = { };
for(var bindingName in bindings)
{
var binding = bindings[bindingName];
// Call bindings starting with _ with the bindingContext as first parameter
if(typeof(binding) === 'function' && bindingName.indexOf('_') == 0) {
parsedBindings[bindingName.slice(1)] = binding.call(bindingContext.$data, bindingContext);
} else if(typeof(binding) === 'object') {
parsedBindings[bindingName] = this.parseBindings(bindings[bindingName], bindingContext);
} else {
parsedBindings[bindingName] = binding;
}
}
return parsedBindings;
};
this.findBindings = function(node, bindingContext) {
var $el = $(node);
var bindings = { };
for(var selector in...