Skip to content

Commit

Permalink
fix(upgrade): fix transclusion on upgraded components
Browse files Browse the repository at this point in the history
Previously, only simple, single-slot transclusion worked on upgraded components.
This commit fixes/adds support for the following:

- Multi-slot transclusion.
- Using fallback content when no transclusion content is provided.
- Destroy unused scope (when using fallback content).

This commit only affects `upgrade/static`. The dynamic version will be fixed in
a follow-up PR.

Fixes angular#13271
  • Loading branch information
gkalpak committed May 31, 2017
1 parent db18e56 commit a9c3431
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 4 deletions.
6 changes: 4 additions & 2 deletions packages/upgrade/src/common/angular1.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ export interface ICompileService {
}
export interface ILinkFn {
(scope: IScope, cloneAttachFn?: ICloneAttachFunction, options?: ILinkFnOptions): IAugmentedJQuery;
$$slots?: {[slotName: string]: ILinkFn};
}
export interface ILinkFnOptions {
parentBoundTranscludeFn?: Function;
Expand Down Expand Up @@ -75,9 +76,10 @@ export interface IDirective {
templateUrl?: string|Function;
templateNamespace?: string;
terminal?: boolean;
transclude?: boolean|'element'|{[key: string]: string};
transclude?: DirectiveTranscludeProperty;
}
export type DirectiveRequireProperty = SingleOrListOrMap<string>;
export type DirectiveTranscludeProperty = boolean | 'element' | {[key: string]: string};
export interface IDirectiveCompileFn {
(templateElement: IAugmentedJQuery, templateAttributes: IAttributes,
transclude: ITranscludeFunction): IDirectivePrePost;
Expand All @@ -97,7 +99,7 @@ export interface IComponent {
require?: DirectiveRequireProperty;
template?: string|Function;
templateUrl?: string|Function;
transclude?: boolean;
transclude?: DirectiveTranscludeProperty;
}
export interface IAttributes { $observe(attr: string, fn: (v: string) => void): void; }
export interface ITranscludeFunction {
Expand Down
8 changes: 8 additions & 0 deletions packages/upgrade/src/common/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
import {Type} from '@angular/core';
import * as angular from './angular1';

const DIRECTIVE_PREFIX_REGEXP = /^(?:x|data)[:\-_]/i;
const DIRECTIVE_SPECIAL_CHARS_REGEXP = /[:\-_]+(.)/g;

export function onError(e: any) {
// TODO: (misko): We seem to not have a stack trace here!
if (console.error) {
Expand All @@ -24,6 +27,11 @@ export function controllerKey(name: string): string {
return '$' + name + 'Controller';
}

export function directiveNormalize(name: string): string {
return name.replace(DIRECTIVE_PREFIX_REGEXP, '')
.replace(DIRECTIVE_SPECIAL_CHARS_REGEXP, (_, letter) => letter.toUpperCase());
}

export function getAttributesAsArray(node: Node): [string, string][] {
const attributes = node.attributes;
let asArray: [string, string][] = undefined !;
Expand Down
5 changes: 3 additions & 2 deletions packages/upgrade/test/common/test_helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,10 @@ export function html(html: string): Element {
return div;
}

export function multiTrim(text: string | null | undefined): string {
export function multiTrim(text: string | null | undefined, allSpace = false): string {
if (typeof text == 'string') {
return text.replace(/\n/g, '').replace(/\s\s+/g, ' ').trim();
const repl = allSpace ? '' : ' ';
return text.replace(/\n/g, '').replace(/\s+/g, repl).trim();
}
throw new Error('Argument can not be undefined.');
}
Expand Down

0 comments on commit a9c3431

Please sign in to comment.