The Template Pipeline Continued...
Matias & Alex
Styling in the template pipeline
- [style.prop]
- [style]
- [class.name]
- [class]
How are the instructions generated?
<div
[style.width]="myWidth"
[class.active]=
"myActiveClass"
[style]="myStyles"
[class]="myClasses">
...
</div>
if (rf & 1) {
element(0, 'div');
}
if (rf & 2) {
styleProp('width',
ctx.myWidth);
classProp('active',
ctx.myActiveClass);
styleMap(ctx.myStyles);
classMap(ctx.myClasses);
}
- Template is parsed into an AST
- Properties are extracted from the AST
- Properties are upgraded into style and class bindings
What is going on here?
<div
[style.width]="myWidth"
[class.active]=
"myActiveClass"
[style]="myStyles"
[class]="myClasses">
...
</div>
// create
ElementNode, // <div>
// update
PropertyNode, // style.width
PropertyNode, // class.active
PropertyNode, // style
PropertyName // class
// [style.width]
property = {
kind: NodeKind.Property,
name: 'style.width',
expression: o.Expression,
}
- Nodes are useless on their own
- They need to be converted into ivy instructions
- Nodes are passed into emitters
Nodes => Ivy Instructions
interface CreateEmitter {
emit(node: CreateNode):
o.Statement|null;
}
interface UpdateEmitter {
emit(node: UpdateNode):
o.Statement|null;
}
- [style], [style.prop], [class] and [class.name] are tread as properties
- How do we get the pipeline to special case them for styling?
But these are just properties
// [style.width]
property = {
kind: NodeKind.Property,
name: 'style.width',
expression: o.Expression,
}
// [style.width]
property = {
kind: NodeKind.StyleProp,
name: 'width',
expression: o.Expression,
}
- Stages modify the set of nodes in the update list into different nodes
- StyleBindingStage
- ClassBindingStage
Style and Class
Property Stages
export class StyleTransform
implements Transform {
visit(node: Node, list: List): Node {
// [style] or [style.prop]
if (node.kind === NodeKind.Property
&& isStyleProp(node.name)) {
node = updateToStyleBinding(node);
}
return node;
}
}
function updateToStyleBinding(
node: PropertyNode) {
if (node.name === 'style') {
return {...} as StyleMap;
} else {
return {...} as StyleProp;
}
}
property = {
kind: NodeKind.StyleProp,
name: 'propName', // width
expression: o.Expression,
}
property = {
kind: NodeKind.StyleMap,
expression: o.Expression,
}
property = {
kind: NodeKind.ClassProp,
name: 'className', // activeClass
expression: o.Expression,
}
property = {
kind: NodeKind.ClassMap,
expression: o.Expression,
}
Our Pair Programming Process
Tuesday
- We always code
- Pairing together over GVC
- VSCode + LiveShare
- Planning and pseudocode'ing
- High-level discussions over API and usecases
Thursday
TL: Jan
- Initial discussions
- High-level talk of data-structures
- Whiteboarding
- Element creation and prototyping
- Plans to get pieces of template.ts into the pipeline
TL: Feb
Positives
- Great feedback
- API iteration
- Simple code structures
- Knowledge share
- Difficult to land things into angular/angular in an intermediate state
Negatives
- Fun experience working on the compiler and spending time designing
- Pleasure to work with Alex :)
Feedback from Matias
Thank you!
The Template Pipeline Continued...
By Matias Niemelä
The Template Pipeline Continued...
- 180