BREAKING CHANGE: - Renderer: * renderComponent method is removed form `Renderer`, only present on `RootRenderer` * Renderer.setDebugInfo is removed. Renderer.createElement / createText / createTemplateAnchor now take the DebugInfo directly. - Query semantics: * Queries don't work with dynamically loaded components. * e.g. for router-outlet: loaded components can't be queries via @ViewQuery, but router-outlet emits an event `activate` now that emits the activated component - Exception classes and the context inside changed (renamed fields) - DebugElement.attributes is an Object and not a Map in JS any more - ChangeDetectorGenConfig was renamed into CompilerConfig - AppViewManager.createEmbeddedViewInContainer / AppViewManager.createHostViewInContainer are removed, use the methods in ViewContainerRef instead - Change detection order changed: * 1. dirty check component inputs * 2. dirty check content children * 3. update render nodes Closes #6301 Closes #6567
77 lines
2.8 KiB
TypeScript
77 lines
2.8 KiB
TypeScript
import {isPresent, isBlank} from 'angular2/src/facade/lang';
|
|
|
|
import * as o from '../output/output_ast';
|
|
import {
|
|
CompileTokenMetadata,
|
|
CompileDirectiveMetadata,
|
|
CompileIdentifierMetadata
|
|
} from '../compile_metadata';
|
|
import {CompileView} from './compile_view';
|
|
|
|
export function getPropertyInView(property: o.Expression, viewPath: CompileView[]): o.Expression {
|
|
if (viewPath.length === 0) {
|
|
return property;
|
|
} else {
|
|
var viewProp: o.Expression = o.THIS_EXPR;
|
|
for (var i = 0; i < viewPath.length; i++) {
|
|
viewProp = viewProp.prop('declarationAppElement').prop('parentView');
|
|
}
|
|
if (property instanceof o.ReadPropExpr) {
|
|
var lastView = viewPath[viewPath.length - 1];
|
|
let readPropExpr: o.ReadPropExpr = property;
|
|
// Note: Don't cast for members of the AppView base class...
|
|
if (lastView.fields.some((field) => field.name == readPropExpr.name) ||
|
|
lastView.getters.some((field) => field.name == readPropExpr.name)) {
|
|
viewProp = viewProp.cast(lastView.classType);
|
|
}
|
|
}
|
|
return o.replaceVarInExpression(o.THIS_EXPR.name, viewProp, property);
|
|
}
|
|
}
|
|
|
|
export function injectFromViewParentInjector(token: CompileTokenMetadata,
|
|
optional: boolean): o.Expression {
|
|
var method = optional ? 'getOptional' : 'get';
|
|
return o.THIS_EXPR.prop('parentInjector').callMethod(method, [createDiTokenExpression(token)]);
|
|
}
|
|
|
|
export function getViewFactoryName(component: CompileDirectiveMetadata,
|
|
embeddedTemplateIndex: number): string {
|
|
return `viewFactory_${component.type.name}${embeddedTemplateIndex}`;
|
|
}
|
|
|
|
|
|
export function createDiTokenExpression(token: CompileTokenMetadata): o.Expression {
|
|
if (isPresent(token.value)) {
|
|
return o.literal(token.value);
|
|
} else if (token.identifierIsInstance) {
|
|
return o.importExpr(token.identifier)
|
|
.instantiate([], o.importType(token.identifier, [], [o.TypeModifier.Const]));
|
|
} else {
|
|
return o.importExpr(token.identifier);
|
|
}
|
|
}
|
|
|
|
export function createFlatArray(expressions: o.Expression[]): o.Expression {
|
|
var lastNonArrayExpressions = [];
|
|
var result: o.Expression = o.literalArr([]);
|
|
for (var i = 0; i < expressions.length; i++) {
|
|
var expr = expressions[i];
|
|
if (expr.type instanceof o.ArrayType) {
|
|
if (lastNonArrayExpressions.length > 0) {
|
|
result =
|
|
result.callMethod(o.BuiltinMethod.ConcatArray, [o.literalArr(lastNonArrayExpressions)]);
|
|
lastNonArrayExpressions = [];
|
|
}
|
|
result = result.callMethod(o.BuiltinMethod.ConcatArray, [expr]);
|
|
} else {
|
|
lastNonArrayExpressions.push(expr);
|
|
}
|
|
}
|
|
if (lastNonArrayExpressions.length > 0) {
|
|
result =
|
|
result.callMethod(o.BuiltinMethod.ConcatArray, [o.literalArr(lastNonArrayExpressions)]);
|
|
}
|
|
return result;
|
|
}
|