diff --git a/tests/app/xml-parser-tests/itemTemplates.xml b/tests/app/xml-parser-tests/itemTemplates.xml
new file mode 100644
index 000000000..1836d9d2e
--- /dev/null
+++ b/tests/app/xml-parser-tests/itemTemplates.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/app/xml-parser-tests/xml-parser-tests.ts b/tests/app/xml-parser-tests/xml-parser-tests.ts
index cd17b3c83..8c1e5050c 100644
--- a/tests/app/xml-parser-tests/xml-parser-tests.ts
+++ b/tests/app/xml-parser-tests/xml-parser-tests.ts
@@ -5,6 +5,7 @@
import * as TKUnit from "../TKUnit";
import * as xmlModule from "tns-core-modules/xml";
import * as fs from "tns-core-modules/file-system";
+import * as builder from "tns-core-modules/ui/builder";
export var test_XmlParser_IsDefined = function () {
TKUnit.assertNotEqual(xmlModule.XmlParser, undefined, "Class XmlParser should be defined!");
@@ -182,3 +183,12 @@ export var test_XmlParser_NamespacesTest = function () {
var xmlString = file.readTextSync();
xmlParser.parse(xmlString);
};
+
+export function test_MultiParserTemplate() {
+ const file = fs.File.fromPath(fs.path.join(__dirname, "itemTemplates.xml"));
+ const xml = file.readTextSync();
+
+ const view: any = builder.parse(xml);
+ TKUnit.assertNotNull(view.items)
+ TKUnit.assertEqual(view.items.length, 1);
+}
\ No newline at end of file
diff --git a/tns-core-modules/ui/builder/builder.ts b/tns-core-modules/ui/builder/builder.ts
index 3d3b966f1..a3b15955c 100644
--- a/tns-core-modules/ui/builder/builder.ts
+++ b/tns-core-modules/ui/builder/builder.ts
@@ -474,6 +474,9 @@ namespace xml2ui {
export class MultiTemplateParser implements XmlStateConsumer {
private _childParsers = new Array();
+ private _value: KeyedTemplate[];
+
+ get value(): KeyedTemplate[] { return this._value; }
constructor(private parent: XmlStateConsumer, private templateProperty: TemplateProperty) {
}
@@ -496,8 +499,8 @@ namespace xml2ui {
createView: this._childParsers[i].buildTemplate()
});
}
- this.templateProperty.parent.component[this.templateProperty.name] = templates;
- return this.parent;
+ this._value = templates;
+ return this.parent.parse(args);
}
}
@@ -564,11 +567,12 @@ namespace xml2ui {
var name = ComponentParser.getComplexPropertyName(args.elementName);
- this.complexProperties.push({
+ const complexProperty: ComponentParser.ComplexProperty = {
parent: parent,
name: name,
- items: [],
- });
+ items: []
+ };
+ this.complexProperties.push(complexProperty);
if (ComponentParser.isKnownTemplate(name, parent.exports)) {
return new TemplateParser(this, {
@@ -583,7 +587,7 @@ namespace xml2ui {
}
if (ComponentParser.isKnownMultiTemplate(name, parent.exports)) {
- return new MultiTemplateParser(this, {
+ const parser = new MultiTemplateParser(this, {
context: (parent ? getExports(parent.component) : null) || this.context, // Passing 'context' won't work if you set "codeFile" on the page
parent: parent,
name: name,
@@ -592,6 +596,8 @@ namespace xml2ui {
errorFormat: this.error,
sourceTracker: this.sourceTracker
});
+ complexProperty.parser = parser;
+ return parser;
}
} else {
@@ -628,7 +634,9 @@ namespace xml2ui {
} else if (args.eventType === xml.ParserEventType.EndElement) {
if (ComponentParser.isComplexProperty(args.elementName)) {
if (complexProperty) {
- if (parent && (parent.component)._addArrayFromBuilder) {
+ if (complexProperty.parser) {
+ parent.component[complexProperty.name] = complexProperty.parser.value;
+ } else if (parent && (parent.component)._addArrayFromBuilder) {
// If parent is AddArrayFromBuilder call the interface method to populate the array property.
(parent.component)._addArrayFromBuilder(complexProperty.name, complexProperty.items);
complexProperty.items = [];
@@ -643,7 +651,7 @@ namespace xml2ui {
}
}
- return this;
+ return this;
}
private static isComplexProperty(name: string): boolean {
@@ -692,6 +700,7 @@ namespace xml2ui {
parent: ComponentModule;
name: string;
items?: Array;
+ parser?: { value: any; };
}
}
}