mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-16 11:42:04 +08:00
FIX: Nested templates are not parsed
This commit is contained in:
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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.
|
||||||
|
1
ui/builder/template-builder.d.ts
vendored
1
ui/builder/template-builder.d.ts
vendored
@ -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;
|
||||||
|
@ -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() {
|
||||||
|
Reference in New Issue
Block a user