ngx-materialize
Version:
An Angular wrap around Materialize library
109 lines (108 loc) • 9.29 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { ApplicationRef, ComponentFactoryResolver, Injectable, Injector, } from '@angular/core';
export class MzInjectionService {
/**
* @param {?} applicationRef
* @param {?} componentFactoryResolver
* @param {?} injector
*/
constructor(applicationRef, componentFactoryResolver, injector) {
this.applicationRef = applicationRef;
this.componentFactoryResolver = componentFactoryResolver;
this.injector = injector;
}
/**
* Appends a component to an adjacent location.
* @template T
* @param {?} componentClass
* @param {?=} options
* @param {?=} location
* @return {?}
*/
appendComponent(componentClass, options = {}, location = this.getContainerElement()) {
// instantiate component to load
const /** @type {?} */ componentFactory = this.componentFactoryResolver.resolveComponentFactory(componentClass);
const /** @type {?} */ componentRef = componentFactory.create(this.injector);
// project the options passed to the component instance
this.projectComponentInputs(componentRef, options);
// attach view for dirty checking
this.applicationRef.attachView(componentRef.hostView);
// detach view when component is destroyed
componentRef.onDestroy(() => {
this.applicationRef.detachView(componentRef.hostView);
});
// append component to location in the DOM where we want it to be rendered
const /** @type {?} */ componentRootNode = this.getComponentRootNode(componentRef);
location.appendChild(componentRootNode);
return componentRef;
}
/**
* Overrides the default container element.
* @param {?} container
* @return {?}
*/
setRootViewContainer(container) {
this.container = container;
}
/**
* Gets the html element for a component ref.
* @param {?} componentRef
* @return {?}
*/
getComponentRootNode(componentRef) {
return /** @type {?} */ ((/** @type {?} */ (componentRef.hostView)).rootNodes[0]);
}
/**
* Gets the container element.
* @return {?}
*/
getContainerElement() {
return this.container || document.body;
}
/**
* Projects the inputs onto the component.
* @template T
* @param {?} component
* @param {?} options
* @return {?}
*/
projectComponentInputs(component, options) {
if (options) {
const /** @type {?} */ props = Object.getOwnPropertyNames(options);
for (const /** @type {?} */ prop of props) {
component.instance[prop] = options[prop];
}
}
return component;
}
}
MzInjectionService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
MzInjectionService.ctorParameters = () => [
{ type: ApplicationRef, },
{ type: ComponentFactoryResolver, },
{ type: Injector, },
];
function MzInjectionService_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
MzInjectionService.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
MzInjectionService.ctorParameters;
/** @type {?} */
MzInjectionService.prototype.container;
/** @type {?} */
MzInjectionService.prototype.applicationRef;
/** @type {?} */
MzInjectionService.prototype.componentFactoryResolver;
/** @type {?} */
MzInjectionService.prototype.injector;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtbWF0ZXJpYWxpemUvIiwic291cmNlcyI6WyJzcmMvc2hhcmVkL2luamVjdGlvbi9pbmplY3Rpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLGNBQWMsRUFDZCx3QkFBd0IsRUFHeEIsVUFBVSxFQUNWLFFBQVEsR0FFVCxNQUFNLGVBQWUsQ0FBQztBQUd2QixNQUFNOzs7Ozs7SUFHSixZQUNVLGdCQUNBLDBCQUNBO1FBRkEsbUJBQWMsR0FBZCxjQUFjO1FBQ2QsNkJBQXdCLEdBQXhCLHdCQUF3QjtRQUN4QixhQUFRLEdBQVIsUUFBUTtLQUNqQjs7Ozs7Ozs7O0lBS0QsZUFBZSxDQUNiLGNBQXVCLEVBQ3ZCLFVBQWUsRUFBRSxFQUNqQixXQUFvQixJQUFJLENBQUMsbUJBQW1CLEVBQUU7O1FBRzlDLHVCQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMvRix1QkFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzs7UUFHNUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQzs7UUFHbkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDOztRQUd0RCxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUMxQixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDdkQsQ0FBQyxDQUFDOztRQUdILHVCQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsRSxRQUFRLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFeEMsTUFBTSxDQUFDLFlBQVksQ0FBQztLQUNyQjs7Ozs7O0lBS0Qsb0JBQW9CLENBQUMsU0FBa0I7UUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7S0FDNUI7Ozs7OztJQUtPLG9CQUFvQixDQUFDLFlBQStCO1FBQzFELE1BQU0sbUJBQUMsbUJBQUMsWUFBWSxDQUFDLFFBQWdDLEVBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFZLEVBQUM7Ozs7OztJQU16RSxtQkFBbUI7UUFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQzs7Ozs7Ozs7O0lBTWpDLHNCQUFzQixDQUFJLFNBQTBCLEVBQUUsT0FBWTtRQUN4RSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ1osdUJBQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsRCxHQUFHLENBQUMsQ0FBQyx1QkFBTSxJQUFJLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDekIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDMUM7U0FDRjtRQUNELE1BQU0sQ0FBQyxTQUFTLENBQUM7Ozs7WUF2RXBCLFVBQVU7Ozs7WUFUVCxjQUFjO1lBQ2Qsd0JBQXdCO1lBSXhCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFwcGxpY2F0aW9uUmVmLFxyXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICBDb21wb25lbnRSZWYsXHJcbiAgRW1iZWRkZWRWaWV3UmVmLFxyXG4gIEluamVjdGFibGUsXHJcbiAgSW5qZWN0b3IsXHJcbiAgVHlwZSxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE16SW5qZWN0aW9uU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBjb250YWluZXI6IEVsZW1lbnQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhcHBsaWNhdGlvblJlZjogQXBwbGljYXRpb25SZWYsXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGVuZHMgYSBjb21wb25lbnQgdG8gYW4gYWRqYWNlbnQgbG9jYXRpb24uXHJcbiAgICovXHJcbiAgYXBwZW5kQ29tcG9uZW50PFQ+KFxyXG4gICAgY29tcG9uZW50Q2xhc3M6IFR5cGU8VD4sXHJcbiAgICBvcHRpb25zOiBhbnkgPSB7fSxcclxuICAgIGxvY2F0aW9uOiBFbGVtZW50ID0gdGhpcy5nZXRDb250YWluZXJFbGVtZW50KCksXHJcbiAgKTogQ29tcG9uZW50UmVmPFQ+IHtcclxuICAgIC8vIGluc3RhbnRpYXRlIGNvbXBvbmVudCB0byBsb2FkXHJcbiAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50Q2xhc3MpO1xyXG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gY29tcG9uZW50RmFjdG9yeS5jcmVhdGUodGhpcy5pbmplY3Rvcik7XHJcblxyXG4gICAgLy8gcHJvamVjdCB0aGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIGNvbXBvbmVudCBpbnN0YW5jZVxyXG4gICAgdGhpcy5wcm9qZWN0Q29tcG9uZW50SW5wdXRzKGNvbXBvbmVudFJlZiwgb3B0aW9ucyk7XHJcblxyXG4gICAgLy8gYXR0YWNoIHZpZXcgZm9yIGRpcnR5IGNoZWNraW5nXHJcbiAgICB0aGlzLmFwcGxpY2F0aW9uUmVmLmF0dGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcclxuXHJcbiAgICAvLyBkZXRhY2ggdmlldyB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWRcclxuICAgIGNvbXBvbmVudFJlZi5vbkRlc3Ryb3koKCkgPT4ge1xyXG4gICAgICB0aGlzLmFwcGxpY2F0aW9uUmVmLmRldGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGFwcGVuZCBjb21wb25lbnQgdG8gbG9jYXRpb24gaW4gdGhlIERPTSB3aGVyZSB3ZSB3YW50IGl0IHRvIGJlIHJlbmRlcmVkXHJcbiAgICBjb25zdCBjb21wb25lbnRSb290Tm9kZSA9IHRoaXMuZ2V0Q29tcG9uZW50Um9vdE5vZGUoY29tcG9uZW50UmVmKTtcclxuICAgIGxvY2F0aW9uLmFwcGVuZENoaWxkKGNvbXBvbmVudFJvb3ROb2RlKTtcclxuXHJcbiAgICByZXR1cm4gY29tcG9uZW50UmVmO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGNvbnRhaW5lciBlbGVtZW50LlxyXG4gICAqL1xyXG4gIHNldFJvb3RWaWV3Q29udGFpbmVyKGNvbnRhaW5lcjogRWxlbWVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBodG1sIGVsZW1lbnQgZm9yIGEgY29tcG9uZW50IHJlZi5cclxuICAgKi9cclxuICBwcml2YXRlIGdldENvbXBvbmVudFJvb3ROb2RlKGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT4pOiBFbGVtZW50IHtcclxuICAgIHJldHVybiAoY29tcG9uZW50UmVmLmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+KS5yb290Tm9kZXNbMF0gYXMgRWxlbWVudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGNvbnRhaW5lciBlbGVtZW50LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0Q29udGFpbmVyRWxlbWVudCgpOiBFbGVtZW50IHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lciB8fCBkb2N1bWVudC5ib2R5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJvamVjdHMgdGhlIGlucHV0cyBvbnRvIHRoZSBjb21wb25lbnQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwcm9qZWN0Q29tcG9uZW50SW5wdXRzPFQ+KGNvbXBvbmVudDogQ29tcG9uZW50UmVmPFQ+LCBvcHRpb25zOiBhbnkpOiBDb21wb25lbnRSZWY8VD4ge1xyXG4gICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgY29uc3QgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvcHRpb25zKTtcclxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XHJcbiAgICAgICAgY29tcG9uZW50Lmluc3RhbmNlW3Byb3BdID0gb3B0aW9uc1twcm9wXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcclxuICB9XHJcbn1cclxuIl19