Walk up data frames for nested @partial-block
The root cause of #1218 is that `invokePartial` creates a stack of data frames for nested partial blocks, but `resolvePartial` always uses the value at top of the stack without "popping" it. The result is an infinite recursive loop, as references to `@partial-block` in the partial at the top of the stack resolve to itself. So, walk up the stack of data frames when evaluating. This is accomplished by 1) setting the `partial-block` property to `noop` after use and 2) using `_parent['partial-block']` if `partial-block` is `noop` Fix #1218
This commit is contained in:
@@ -210,7 +210,12 @@ export function wrapProgram(container, i, fn, data, declaredBlockParams, blockPa
|
||||
export function resolvePartial(partial, context, options) {
|
||||
if (!partial) {
|
||||
if (options.name === '@partial-block') {
|
||||
partial = options.data['partial-block'];
|
||||
let data = options.data;
|
||||
while (data['partial-block'] === noop) {
|
||||
data = data._parent;
|
||||
}
|
||||
partial = data['partial-block'];
|
||||
data['partial-block'] = noop;
|
||||
} else {
|
||||
partial = options.partials[options.name];
|
||||
}
|
||||
|
||||
@@ -270,6 +270,20 @@ describe('partials', function() {
|
||||
true,
|
||||
'success');
|
||||
});
|
||||
it('should render nested partial blocks', function() {
|
||||
shouldCompileToWithPartials(
|
||||
'.template-start.{{#> outer}}{{value}}{{/outer}}.template-end.',
|
||||
[
|
||||
{value: 'success'},
|
||||
{},
|
||||
{
|
||||
outer: '.outer-start.{{#> nested}}.outer-partial-block-start.{{> @partial-block}}.outer-partial-block-end.{{/nested}}.outer-end.',
|
||||
nested: '.nested-start.{{> @partial-block}}.nested-end.'
|
||||
}
|
||||
],
|
||||
true,
|
||||
'.template-start..outer-start..nested-start..outer-partial-block-start.success.outer-partial-block-end..nested-end..outer-end..template-end.');
|
||||
});
|
||||
});
|
||||
|
||||
describe('inline partials', function() {
|
||||
|
||||
Reference in New Issue
Block a user