Skip to content

Commit 617fa92

Browse files
author
Hristo Hristov
authored
Fix MultiTemplateParser to not eat its closing tag (NativeScript#4756)
1 parent 457407e commit 617fa92

File tree

3 files changed

+42
-8
lines changed

3 files changed

+42
-8
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<TabView>
2+
<TabView.items>
3+
<TabViewItem title="My Tab">
4+
<TabViewItem.view>
5+
<ListView items="{{ $value }}" itemTemplateSelector="selectItemTemplate">
6+
<ListView.itemTemplates>
7+
<template key="foo">
8+
<Label text="{{ title }}" />
9+
</template>
10+
</ListView.itemTemplates>
11+
</ListView>
12+
</TabViewItem.view>
13+
</TabViewItem>
14+
</TabView.items>
15+
</TabView>

tests/app/xml-parser-tests/xml-parser-tests.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import * as TKUnit from "../TKUnit";
66
import * as xmlModule from "tns-core-modules/xml";
77
import * as fs from "tns-core-modules/file-system";
8+
import * as builder from "tns-core-modules/ui/builder";
89

910
export var test_XmlParser_IsDefined = function () {
1011
TKUnit.assertNotEqual(xmlModule.XmlParser, undefined, "Class XmlParser should be defined!");
@@ -182,3 +183,12 @@ export var test_XmlParser_NamespacesTest = function () {
182183
var xmlString = file.readTextSync();
183184
xmlParser.parse(xmlString);
184185
};
186+
187+
export function test_MultiParserTemplate() {
188+
const file = fs.File.fromPath(fs.path.join(__dirname, "itemTemplates.xml"));
189+
const xml = file.readTextSync();
190+
191+
const view: any = builder.parse(xml);
192+
TKUnit.assertNotNull(view.items)
193+
TKUnit.assertEqual(view.items.length, 1);
194+
}

tns-core-modules/ui/builder/builder.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,9 @@ namespace xml2ui {
474474

475475
export class MultiTemplateParser implements XmlStateConsumer {
476476
private _childParsers = new Array<TemplateParser>();
477+
private _value: KeyedTemplate[];
478+
479+
get value(): KeyedTemplate[] { return this._value; }
477480

478481
constructor(private parent: XmlStateConsumer, private templateProperty: TemplateProperty) {
479482
}
@@ -496,8 +499,8 @@ namespace xml2ui {
496499
createView: this._childParsers[i].buildTemplate()
497500
});
498501
}
499-
this.templateProperty.parent.component[this.templateProperty.name] = templates;
500-
return this.parent;
502+
this._value = templates;
503+
return this.parent.parse(args);
501504
}
502505
}
503506

@@ -564,11 +567,12 @@ namespace xml2ui {
564567

565568
var name = ComponentParser.getComplexPropertyName(args.elementName);
566569

567-
this.complexProperties.push({
570+
const complexProperty: ComponentParser.ComplexProperty = {
568571
parent: parent,
569572
name: name,
570-
items: [],
571-
});
573+
items: []
574+
};
575+
this.complexProperties.push(complexProperty);
572576

573577
if (ComponentParser.isKnownTemplate(name, parent.exports)) {
574578
return new TemplateParser(this, {
@@ -583,7 +587,7 @@ namespace xml2ui {
583587
}
584588

585589
if (ComponentParser.isKnownMultiTemplate(name, parent.exports)) {
586-
return new MultiTemplateParser(this, {
590+
const parser = new MultiTemplateParser(this, {
587591
context: (parent ? getExports(parent.component) : null) || this.context, // Passing 'context' won't work if you set "codeFile" on the page
588592
parent: parent,
589593
name: name,
@@ -592,6 +596,8 @@ namespace xml2ui {
592596
errorFormat: this.error,
593597
sourceTracker: this.sourceTracker
594598
});
599+
complexProperty.parser = parser;
600+
return parser;
595601
}
596602

597603
} else {
@@ -628,7 +634,9 @@ namespace xml2ui {
628634
} else if (args.eventType === xml.ParserEventType.EndElement) {
629635
if (ComponentParser.isComplexProperty(args.elementName)) {
630636
if (complexProperty) {
631-
if (parent && (<any>parent.component)._addArrayFromBuilder) {
637+
if (complexProperty.parser) {
638+
parent.component[complexProperty.name] = complexProperty.parser.value;
639+
} else if (parent && (<any>parent.component)._addArrayFromBuilder) {
632640
// If parent is AddArrayFromBuilder call the interface method to populate the array property.
633641
(<any>parent.component)._addArrayFromBuilder(complexProperty.name, complexProperty.items);
634642
complexProperty.items = [];
@@ -643,7 +651,7 @@ namespace xml2ui {
643651
}
644652
}
645653

646-
return this;
654+
return this;
647655
}
648656

649657
private static isComplexProperty(name: string): boolean {
@@ -692,6 +700,7 @@ namespace xml2ui {
692700
parent: ComponentModule;
693701
name: string;
694702
items?: Array<any>;
703+
parser?: { value: any; };
695704
}
696705
}
697706
}

0 commit comments

Comments
 (0)