You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
3.0 KiB
75 lines
3.0 KiB
define([ |
|
"require", |
|
"dojo/_base/kernel", |
|
"dojo/_base/lang", |
|
"dojo/has!dojo-parser?:dojo/_base/window", |
|
"dojo/has", |
|
"dojo/has!dojo-mobile-parser?:dojo/parser", |
|
"dojo/has!dojo-parser?:dojox/mobile/parser", |
|
"dojox/mvc/_atBindingMixin", |
|
"dojox/mvc/Element" |
|
], function(require, kernel, lang, win, has, parser, mobileParser, _atBindingMixin){ |
|
|
|
// module: |
|
// dojox/mvc/parserExtension |
|
// summary: |
|
// A extension of Dojo parser that allows data binding without specifying data-dojo-type. |
|
|
|
has.add("dom-qsa", !!document.createElement("div").querySelectorAll); |
|
try{ has.add("dojo-parser", !!require("dojo/parser")); }catch(e){} |
|
try{ has.add("dojo-mobile-parser", !!require("dojox/mobile/parser")); }catch(e){} |
|
|
|
if(has("dojo-parser")){ |
|
var oldScan = parser.scan; |
|
|
|
parser.scan = function(/*DOMNode?*/ root, /*Object*/ options){ |
|
// summary: |
|
// Find list of DOM nodes that has data-dojo-bind, but not data-dojo-type. |
|
// And add them to list of DOM nodes to instantiate widget (dojox/mvc/Element). |
|
|
|
return oldScan.apply(this, lang._toArray(arguments)).then(function(list){ |
|
var dojoType = (options.scope || kernel._scopeName) + "Type", // typically "dojoType" |
|
attrData = "data-" + (options.scope || kernel._scopeName) + "-", // typically "data-dojo-" |
|
dataDojoType = attrData + "type"; // typically "data-dojo-type" |
|
|
|
for(var nodes = has("dom-qsa") ? root.querySelectorAll("[" + _atBindingMixin.prototype.dataBindAttr + "]") : root.getElementsByTagName("*"), i = 0, l = nodes.length; i < l; i++){ |
|
var node = nodes[i], foundBindingInAttribs = false; |
|
if(!node.getAttribute(dataDojoType) && !node.getAttribute(dojoType) && node.getAttribute(_atBindingMixin.prototype.dataBindAttr)){ |
|
list.push({ |
|
types: ["dojox/mvc/Element"], |
|
node: node |
|
}); |
|
} |
|
} |
|
|
|
return list; |
|
}); |
|
}; |
|
} |
|
|
|
if(has("dojo-mobile-parser")){ |
|
var oldParse = mobileParser.parse; |
|
|
|
mobileParser.parse = function(/*DOMNode?*/ root, /*Object*/ options){ |
|
// summary: |
|
// Find list of DOM nodes that has data-dojo-bind, but not data-dojo-type. |
|
// Set dojox/mvc/Element to their data-dojo-type. |
|
|
|
var dojoType = ((options || {}).scope || kernel._scopeName) + "Type", // typically "dojoType" |
|
attrData = "data-" + ((options || {}).scope || kernel._scopeName) + "-", // typically "data-dojo-" |
|
dataDojoType = attrData + "type"; // typically "data-dojo-type" |
|
nodes = has("dom-qsa") ? (root || win.body()).querySelectorAll("[" + _atBindingMixin.prototype.dataBindAttr + "]") : (root || win.body()).getElementsByTagName("*"); |
|
|
|
for(var i = 0, l = nodes.length; i < l; i++){ |
|
var node = nodes[i], foundBindingInAttribs = false, bindingsInAttribs = []; |
|
if(!node.getAttribute(dataDojoType) && !node.getAttribute(dojoType) && node.getAttribute(_atBindingMixin.prototype.dataBindAttr)){ |
|
node.setAttribute(dataDojoType, "dojox/mvc/Element"); |
|
} |
|
} |
|
|
|
return oldParse.apply(this, lang._toArray(arguments)); |
|
}; |
|
} |
|
|
|
return parser || mobileParser; |
|
});
|
|
|