diff --git a/avalon.js b/avalon.js index 1a1f24575..4b53ed4c5 100644 --- a/avalon.js +++ b/avalon.js @@ -2601,17 +2601,29 @@ } } else if (method === "include" && val) { var vmodels = data.vmodels - var rendered = getBindingCallback(elem, "data-include-rendered", vmodels) - var loaded = getBindingCallback(elem, "data-include-loaded", vmodels) + var rendered = data.includeRendered + var loaded = data.includeLoaded + var replace = data.includeReplaced + var target = replace ? elem.parentNode : elem function scanTemplate(text) { if (loaded) { - text = loaded.apply(elem, [text].concat(vmodels)) + text = loaded.apply(target, [text].concat(vmodels)) } - avalon.innerHTML(elem, text) - scanNodeList(elem, vmodels) - rendered && checkScan(elem, function() { - rendered.call(elem) + + while (true) { + var node = data.startInclude.nextSibling + if (node && node !== data.endInclude) { + target.removeChild(node) + } else { + break + } + } + var dom = avalon.parseHTML(text) + target.insertBefore(dom, data.endInclude) + scanNodeList(dom, vmodels) + rendered && checkScan(target, function() { + rendered.call(target) }) } if (data.param === "src") { @@ -2971,6 +2983,22 @@ text = RegExp.$1 } } + if (data.type === "include") { + var elem = data.element + data.includeRendered = getBindingCallback(elem, "data-include-rendered", vmodels) + data.includeLoaded = getBindingCallback(elem, "data-include-loaded", vmodels) + var outer = data.includeReplaced = !!avalon(elem).data("includeReplace") + data.startInclude = DOC.createComment("ms-include") + data.endInclude = DOC.createComment("ms-include-end") + if (outer) { + data.element = data.startInclude + elem.parentNode.insertBefore(data.startInclude, elem) + elem.parentNode.insertBefore(data.endInclude, elem.nextSibling) + } else { + elem.insertBefore(data.startInclude, elem.firstChild) + elem.appendChild(data.endInclude) + } + } data.handlerName = "attr" //handleName用于处理多种绑定共用同一种bindingExecutor的情况 parseExprProxy(text, vmodels, data, (simple ? null : scanExpr(data.value))) }, diff --git a/examples/include2.html b/examples/include2.html new file mode 100644 index 000000000..ef6a3f072 --- /dev/null +++ b/examples/include2.html @@ -0,0 +1,32 @@ + + + + + duplexHooks + + + + + + + +
+
+ + diff --git a/examples/include2aaa.html b/examples/include2aaa.html new file mode 100644 index 000000000..a28e43513 --- /dev/null +++ b/examples/include2aaa.html @@ -0,0 +1,2 @@ +
xxxxxxxxxxxxx
+
yyyyyyyyyyyy
\ No newline at end of file diff --git a/examples/include2bbb.html b/examples/include2bbb.html new file mode 100644 index 000000000..e9fbc827e --- /dev/null +++ b/examples/include2bbb.html @@ -0,0 +1,3 @@ +

aaaaaaaaaaa

+

bbbbbbbbbbb

+

ccccccccccc

\ No newline at end of file diff --git a/test.html b/test.html deleted file mode 100644 index 34a6c2243..000000000 --- a/test.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - duplexHooks - - - - - - - - - -