in Canvas/CanvasSimple/lib/winjs-4.0.1/js/base.js [21213:21309]
gatherBindings: function () {
var bindTokens = -1;
var that = this;
var nestedTemplates = -1;
var bindings = [];
var selector = "[data-win-bind],[data-win-control]";
var elements = this._templateContent.querySelectorAll(selector);
for (var i = 0, len = elements.length; i < len; i++) {
var element = elements[i];
// If we run into a declarative control container (e.g. Binding.Template) we don't
// bind its children, but we will give it an opportunity to process later using the
// same data context.
if (element.isDeclarativeControlContainer) {
i += element.querySelectorAll(selector).length;
}
// Since we had to look for controls as well as bindings in order to skip controls
// which are declarative control containers we have to check if this element is bound
if (!element.hasAttribute("data-win-bind")) {
continue;
}
var bindingText = element.getAttribute("data-win-bind");
var elementBindings = binding_parser(bindingText, _Global);
elementBindings.forEach(function (binding) {
if (binding.initializer) {
// If an initializer is specified it may be a nested template
var initializerName = binding.initializer.join(".");
var initializer = globalLookup(binding.initializer);
if (initializer.render) {
requireSupportedForProcessing(initializer.render);
// We have already chceked this to be safe for import
binding.template = that.importFunctionSafe(initializerName, initializer);
binding.pathExpression = that.bindingExpression(binding);
binding.nestedTemplate = ++nestedTemplates;
binding.kind = BindingKind.template;
} else if (initializer.winControl && initializer.winControl.render) {
requireSupportedForProcessing(initializer.winControl.render);
// We have already checked this to be safe to import
binding.template = that.importFunctionSafe(initializerName, initializer.winControl);
binding.pathExpression = that.bindingExpression(binding);
binding.nestedTemplate = ++nestedTemplates;
binding.kind = BindingKind.template;
} else {
// Don't get the path expression here, we will do it if needed in optimize
binding.initializer = that.importFunction(initializerName, initializer);
binding.bindToken = ++bindTokens;
binding.kind = BindingKind.initializer;
}
} else {
// Don't get the path expression here, we will do it if needed in optimize
// We have already checked this to be safe to import
binding.initializer = that.importFunctionSafe("templateDefaultInitializer", that._defaultInitializer);
binding.bindToken = ++bindTokens;
binding.kind = BindingKind.initializer;
}
binding.elementCapture = that.capture(element);
binding.bindingText = bindingText;
});
bindings.push.apply(bindings, elementBindings);
}
var nestedTemplateCount = nestedTemplates + 1;
if (nestedTemplateCount > 0) {
this.async = true;
this._nestedTemplates = this.defineInstance(
InstanceKind.variable,
"nestedTemplates",
function () { return newArray(nestedTemplateCount); }
);
}
var bindTokenCount = bindTokens + 1;
if (bindTokenCount > 0) {
this._bindTokens = this.defineInstance(
InstanceKind.variable,
"bindTokens",
function () { return newArray(bindTokenCount); }
);
this._suffix.push(function () {
// NOTE: returnedElement is a local in the template which is set to either be the container
// or in the extractChild: true case the first child.
return that.formatCode(
"{utilities_data}(returnedElement).bindTokens = {bindTokens}",
{
utilities_data: that._staticVariables.utilities_data,
bindTokens: that._bindTokens,
}
);
});
}
return bindings;
},