Skip to content

Commit b00d325

Browse files
committed
Move view component resolution to element-registry.
Expose an API to register other components.
1 parent f308395 commit b00d325

File tree

3 files changed

+63
-23
lines changed

3 files changed

+63
-23
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
declare module "nativescript-angular/element-registry" {
2+
import {View} from 'ui/core/view';
3+
4+
export interface TypeId {
5+
moduleName: string;
6+
className: string;
7+
}
8+
9+
export interface ViewClass {
10+
new(): View
11+
}
12+
13+
export function registerElement(elementName: string, typeId: TypeId): void;
14+
export function isKnownView(elementName: string): boolean;
15+
export function getViewClass(elementName: string): ViewClass;
16+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import {View} from 'ui/core/view';
2+
import {TypeId, ViewClass} from 'nativescript-angular/element-registry';
3+
4+
var elementMap: Map<string, TypeId> = new Map<string, TypeId>();
5+
6+
export function registerElement(elementName: string, typeId: TypeId): void {
7+
if (elementMap.has(elementName)) {
8+
throw new Error(`Element for ${elementName} already registered.`);
9+
} else {
10+
elementMap.set(elementName, typeId);
11+
elementMap.set(elementName.toLowerCase(), typeId);
12+
}
13+
}
14+
15+
export function getViewClass(elementName: string): ViewClass {
16+
console.log('getViewClass: ' + elementName);
17+
let typeId = elementMap.get(elementName) ||
18+
elementMap.get(elementName.toLowerCase());
19+
if (!typeId) {
20+
throw new TypeError(`No known component for element ${elementName}.`);
21+
}
22+
try {
23+
let module = require(typeId.moduleName);
24+
return module[typeId.className];
25+
} catch (e) {
26+
throw new TypeError(`Could not load type: ${typeId.moduleName}.${typeId.className}.
27+
28+
${e}`);
29+
}
30+
}
31+
32+
export function isKnownView(elementName: string): boolean {
33+
return elementMap.has(elementName) ||
34+
elementMap.has(elementName.toLowerCase());
35+
}
36+
37+
//Register default NativeScript components
38+
registerElement("Button", {className: "Button", moduleName: "ui/button"});
39+
registerElement("Label", {className: "Label", moduleName: "ui/label"});
40+
registerElement("TextField", {className: "TextField", moduleName: "ui/text-field"});
41+
registerElement("TextView", {className: "TextView", moduleName: "ui/text-view"});
42+
registerElement("Switch", {className: "Switch", moduleName: "ui/switch"});
43+
registerElement("StackLayout", {className: "StackLayout", moduleName: "ui/layouts/stack-layout"});
44+
registerElement("DockLayout", {className: "DockLayout", moduleName: "ui/layouts/dock-layout"});

src/nativescript-angular/view_node.ts

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,11 @@ import {LayoutBase} from 'ui/layouts/layout-base';
1414
import gestures = require("ui/gestures");
1515
import {NativeScriptView} from 'nativescript-angular/renderer';
1616
import {AST} from 'angular2/src/change_detection/parser/ast';
17-
18-
interface ViewClass {
19-
new(): View
20-
}
17+
import {ViewClass, getViewClass, isKnownView} from 'nativescript-angular/element-registry';
2118

2219
type EventHandler = (args: EventData) => void;
2320

2421
export class ViewNode {
25-
//TODO: move element registration and imports to a new module
26-
private static allowedElements: Map<string, ViewClass> = new Map<string, ViewClass>([
27-
["button", Button],
28-
["stacklayout", StackLayout],
29-
["docklayout", DockLayout],
30-
["textfield", TextField],
31-
["textview", TextView],
32-
["label", Label],
33-
["switch", Switch],
34-
["template", ContentView],
35-
]);
36-
37-
3822
private eventListeners: Map<string, EventHandler> = new Map<string, EventHandler>();
3923

4024
public nativeView: View;
@@ -106,20 +90,16 @@ export class ViewNode {
10690
});
10791
}
10892

109-
private getViewClass(): ViewClass {
110-
return ViewNode.allowedElements.get(this.viewName);
111-
}
112-
11393
private createUI(attachAtIndex: number) {
114-
if (!ViewNode.allowedElements.has(this.viewName))
94+
if (!isKnownView(this.viewName))
11595
return;
11696

11797
console.log('createUI: ' + this.viewName +
11898
', attachAt: ' + attachAtIndex +
11999
', parent: ' + this.parentNode.viewName +
120100
', parent UI ' + (<any>this.parentNativeView.constructor).name);
121101

122-
let viewClass = this.getViewClass();
102+
let viewClass = getViewClass(this.viewName);
123103
if (!this.nativeView) {
124104
this.nativeView = new viewClass();
125105
} else {

0 commit comments

Comments
 (0)