FIX: Nested templates are not parsed

This commit is contained in:
vakrilov
2015-08-07 11:44:16 +03:00
parent 171017e526
commit bccd5133a3
4 changed files with 63 additions and 7 deletions

View File

@ -476,3 +476,48 @@ export function test_parse_ShouldParseNestedListViewInListViewTemplate() {
helper.goBack(); helper.goBack();
} }
} }
export function test_parse_NestedRepeaters() {
var pageXML =
"<Page xmlns='http://www.nativescript.org/tns.xsd'>" +
" <Repeater items='{{ $value }}'>" +
" <Repeater.itemTemplate>" +
" <StackLayout>" +
" <Repeater items='{{ $value }}'>" +
" <Repeater.itemTemplate>" +
" <Label text='{{ $value }}'/>" +
" </Repeater.itemTemplate>" +
" </Repeater>" +
" </StackLayout>" +
" </Repeater.itemTemplate>" +
" </Repeater>" +
"</Page>";
var p = <page.Page>builder.parse(pageXML);
function testAction(views: Array<viewModule.View>) {
p.bindingContext = [["0", "1"], ["2", "3"]];
TKUnit.wait(0.2);
var lbls = new Array<labelModule.Label>();
view.eachDescendant(p, (v) => {
if (v instanceof labelModule.Label) {
lbls.push(v);
}
return true;
});
TKUnit.assertEqual(lbls.length, 4, "labels count");
lbls.forEach((lbl, index, arr) => {
TKUnit.assertEqual(lbl.text.toString(), index.toString(), "label text");
});
};
helper.navigate(function () { return p; });
try {
testAction([p.content, p]);
}
finally {
helper.goBack();
}
}

View File

@ -79,13 +79,13 @@ function parseInternal(value: string, context: any): componentBuilder.ComponentM
if (args.eventType === xml.ParserEventType.StartElement) { if (args.eventType === xml.ParserEventType.StartElement) {
templateBuilder.addStartElement(args.prefix, args.namespace, args.elementName, args.attributes); templateBuilder.addStartElement(args.prefix, args.namespace, args.elementName, args.attributes);
} else if (args.eventType === xml.ParserEventType.EndElement) { } else if (args.eventType === xml.ParserEventType.EndElement) {
if (templateBuilder.elementName !== args.elementName) { templateBuilder.addEndElement(args.prefix, args.elementName);
templateBuilder.addEndElement(args.prefix, args.elementName); if (templateBuilder.hasFinished()) {
} else {
templateBuilder.build(); templateBuilder.build();
templateBuilder = undefined; templateBuilder = undefined;
} }
} }
return;
} }
// Get the current parent. // Get the current parent.

View File

@ -9,6 +9,7 @@ declare module "ui/builder/template-builder" {
addStartElement(prefix: string, namespace: string, elementName: string, attributes: Object); addStartElement(prefix: string, namespace: string, elementName: string, attributes: Object);
addEndElement(prefix: string, elementName: string); addEndElement(prefix: string, elementName: string);
build(); build();
hasFinished();
} }
export function isKnownTemplate(name: string, exports: any): boolean; export function isKnownTemplate(name: string, exports: any): boolean;

View File

@ -5,10 +5,12 @@ var KNOWNTEMPLATES = "knownTemplates";
export class TemplateBuilder { export class TemplateBuilder {
private _items: Array<string>; private _items: Array<string>;
private _templateProperty: definition.TemplateProperty; private _templateProperty: definition.TemplateProperty;
private _nestingLevel: number;
constructor(templateProperty: definition.TemplateProperty) { constructor(templateProperty: definition.TemplateProperty) {
this._items = new Array<string>(); this._items = new Array<string>();
this._templateProperty = templateProperty; this._templateProperty = templateProperty;
this._nestingLevel = 0;
} }
public get elementName(): string { public get elementName(): string {
@ -16,15 +18,23 @@ export class TemplateBuilder {
} }
public addStartElement(prefix: string, namespace: string, elementName: string, attributes: Object) { public addStartElement(prefix: string, namespace: string, elementName: string, attributes: Object) {
this._nestingLevel++;
this._items.push("<" + this._items.push("<" +
getElementNameWithPrefix(prefix, elementName) + getElementNameWithPrefix(prefix, elementName) +
(namespace ? " " + getNamespace(prefix, namespace) : "") + (namespace ? " " + getNamespace(prefix, namespace) : "") +
(attributes ? " " + getAttributesAsString(attributes) : "") + (attributes ? " " + getAttributesAsString(attributes) : "") +
">"); ">");
} }
public addEndElement(prefix: string, elementName: string) { public addEndElement(prefix: string, elementName: string) {
this._items.push("</" + getElementNameWithPrefix(prefix, elementName) + ">"); this._nestingLevel--;
if (!this.hasFinished()) {
this._items.push("</" + getElementNameWithPrefix(prefix, elementName) + ">");
}
}
public hasFinished() {
return this._nestingLevel < 0;
} }
public build() { public build() {