Skip to content

Commit e366533

Browse files
committed
Switch to using an OpaqueToken.
1 parent c9e1844 commit e366533

File tree

6 files changed

+22
-20
lines changed

6 files changed

+22
-20
lines changed

src/demo-app/dialog/dialog-demo.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {Component, Inject} from '@angular/core';
2-
import {DOCUMENT} from '@angular/platform-browser';
3-
import {MdDialog, MdDialogRef, MdDialogConfig, MdDialogData} from '@angular/material';
2+
import {MdDialog, MdDialogRef, MdDialogConfig, MD_DIALOG_DATA} from '@angular/material';
43

54

65
@Component({
@@ -69,7 +68,7 @@ export class DialogDemo {
6968
export class JazzDialog {
7069
constructor(
7170
public dialogRef: MdDialogRef<JazzDialog>,
72-
public data: MdDialogData) { }
71+
@Inject(MD_DIALOG_DATA) public data: any) { }
7372
}
7473

7574

src/lib/dialog/dialog-config.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@ export interface DialogPosition {
1111
right?: string;
1212
};
1313

14-
/** Data to be injected into a dialog. */
15-
export class MdDialogData {
16-
[key: string]: any;
17-
}
18-
1914
/**
2015
* Configuration for opening a modal dialog with the MdDialog service.
2116
*/
@@ -38,7 +33,7 @@ export class MdDialogConfig {
3833
position?: DialogPosition;
3934

4035
/** Data being injected into the child component. */
41-
data?: MdDialogData;
36+
data?: any;
4237

4338
// TODO(jelbourn): add configuration for lifecycle hooks, ARIA labelling.
4439
}

src/lib/dialog/dialog-injector.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
import {Injector} from '@angular/core';
1+
import {Injector, OpaqueToken} from '@angular/core';
22
import {MdDialogRef} from './dialog-ref';
3-
import {MdDialogData} from './dialog-config';
43

4+
export const MD_DIALOG_DATA = new OpaqueToken('MdDialogData');
55

66
/** Custom injector type specifically for instantiating components with a dialog. */
77
export class DialogInjector implements Injector {
88
constructor(
9+
private _parentInjector: Injector,
910
private _dialogRef: MdDialogRef<any>,
10-
private _data: MdDialogData,
11-
private _parentInjector: Injector) { }
11+
private _data: any) { }
1212

1313
get(token: any, notFoundValue?: any): any {
1414
if (token === MdDialogRef) {
1515
return this._dialogRef;
1616
}
1717

18-
if (token === MdDialogData && this._data) {
18+
if (token === MD_DIALOG_DATA && this._data) {
1919
return this._data;
2020
}
2121

src/lib/dialog/dialog.spec.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,21 @@ import {
77
TestBed,
88
tick,
99
} from '@angular/core/testing';
10+
import {NgModule,
11+
Component,
12+
Directive,
13+
ViewChild,
14+
ViewContainerRef,
15+
Injector,
16+
Inject,
17+
} from '@angular/core';
1018
import {By} from '@angular/platform-browser';
11-
import {NgModule, Component, Directive, ViewChild, ViewContainerRef, Injector} from '@angular/core';
1219
import {MdDialogModule} from './index';
1320
import {MdDialog} from './dialog';
1421
import {OverlayContainer} from '../core';
1522
import {MdDialogRef} from './dialog-ref';
1623
import {MdDialogContainer} from './dialog-container';
17-
import {MdDialogData} from './dialog-config';
24+
import {MD_DIALOG_DATA} from './dialog-injector';
1825

1926

2027
describe('MdDialog', () => {
@@ -283,8 +290,8 @@ describe('MdDialog', () => {
283290

284291
let instance = dialog.open(DialogWithInjectedData, config).componentInstance;
285292

286-
expect(instance.data['stringParam']).toBe(config.data.stringParam);
287-
expect(instance.data['dateParam']).toBe(config.data.dateParam);
293+
expect(instance.data.stringParam).toBe(config.data.stringParam);
294+
expect(instance.data.dateParam).toBe(config.data.dateParam);
288295
});
289296

290297
it('should throw if injected data is expected but none is passed', () => {
@@ -531,7 +538,7 @@ class ComponentThatProvidesMdDialog {
531538
/** Simple component for testing ComponentPortal. */
532539
@Component({template: ''})
533540
class DialogWithInjectedData {
534-
constructor(public data: MdDialogData) { }
541+
constructor(@Inject(MD_DIALOG_DATA) public data: any) { }
535542
}
536543

537544
// Create a real (non-test) NgModule as a workaround for

src/lib/dialog/dialog.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ export class MdDialog {
141141
// inject the MdDialogRef. This allows a component loaded inside of a dialog to close itself
142142
// and, optionally, to return a value.
143143
let userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;
144-
let dialogInjector = new DialogInjector(dialogRef, config.data, userInjector || this._injector);
144+
let dialogInjector = new DialogInjector(userInjector || this._injector, dialogRef, config.data);
145145

146146
let contentPortal = new ComponentPortal(component, null, dialogInjector);
147147

src/lib/dialog/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,4 @@ export * from './dialog-container';
5757
export * from './dialog-content-directives';
5858
export * from './dialog-config';
5959
export * from './dialog-ref';
60+
export {MD_DIALOG_DATA} from './dialog-injector';

0 commit comments

Comments
 (0)