typescript - for - Integrando Material Design Lite con Angular2
get mdl angular (7)
Tengo un pequeño problema al integrar un diseño de material ( http://www.getmdl.io/ ) en ng2. ¿Pueden ayudarme? Lo pondré en puntos de lo que he hecho.
- http://www.getmdl.io/started/index.html#tab1 , explica la integración del diseño
- http://www.getmdl.io/components/index.html#textfields-section , este es un ejemplo de campo de texto con etiqueta flotante y ahora tengo el Plunkr , que Plunkr , pero NO Plunkr , ¿ Plunkr echar un vistazo? Como puede ver en index.html, tengo la inclusión de archivos css y js como lo sugiere http://www.getmdl.io/started/index.html#tab1
<!-- GetMDL scripts --> <link rel="stylesheet" href="https://storage.googleapis.com/code.getmdl.io/1.0.6/material.indigo-pink.min.css"> <script src="https://storage.googleapis.com/code.getmdl.io/1.0.6/material.min.js"></script> <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons"> <!-- GetMDL scripts -->
Y en el archivo app.component.ts:
import {Component, ViewEncapsulation} from ''angular2/core'';
@Component({
selector: ''my-app'',
template: `<form action="#">
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<input class="mdl-textfield__input" type="text" id="sample3">
<label class="mdl-textfield__label" for="sample3">Text...</label>
</div>
</form>`,
encapsulation:ViewEncapsulation.None,
})
El proyecto de demostración ng2-webpack incluye una sencilla aplicación ng2 CRUD que usa MDL de vainilla
Pasos:
- npm install --save material-design-lite
- importar toda la biblioteca en src / vendor.js
- o solo los componentes deseados
- en src / style / app.scss, importe los componentes deseados:
Cuestiones:
Problema: los efectos DOM aumentados de MDL no se aplican:
- consistentemente durante los cambios de estado
- durante los cambios de ruta
Solución:
ngAfterViewInit() {
// Ensure material-design-lite effects are applied
componentHandler.upgradeDom();
}
vea Trabajando con Material Design Lite para más detalles.
El problema es que Material Design Lite no está diseñado para usarse con páginas dinámicas como las generadas por Angular2.
Dicho esto, debería ser posible utilizando la función MDL
componentHandler.upgradeElement
.
Puede encontrar más información sobre esto aquí: http://www.getmdl.io/started/#dynamic
Sugeriría obtener un
ElementRef
en sus componentes angulares y luego llamar a esta función en el elemento ref en uno de los componentes del ciclo de vida de sus componentes, probablemente
ngAfterViewInit()
Estaba enfrentando el mismo problema (ya que estoy usando la misma plantilla que tú).
Simplemente intente
componentHandler.upgradeAllRegistered()
funcionará bien en su caso.
Se produce un problema diferente cuando intenta dividir el encabezado en componentes pequeños.
Gracias chicos, funciona de maravilla, para concluir esto, una solución completa, que funciona bien para mí (probado con beta6).
Sin demasiado código repetitivo.
Lo único que no pude trabajar fueron elementos realmente agregados dinámicamente a través de
*ngFor
dependiendo de una variable componente.
Ver
dynamic elements
en la plantilla.
Quizás uno de ustedes sepa cómo sortear eso.
Vea un plunkr funcione (la vista previa debe tener al menos plunkr ancho para ver el encabezado)
Instalar MDL
npm i material-design-lite --save
Haz referencia en tu index.html
<script src="/node_modules/material-design-lite/material.min.js"></script>
<!-- from http://www.getmdl.io/customize/index.html -->
<link rel="stylesheet" href="/css/customized-material.min.css">
Crear
MaterialDesignLiteUpgradeElement.ts
import {Directive, AfterViewInit} from ''angular2/core'';
declare var componentHandler: any;
@Directive({
selector: ''[mdl]''
})
export class MDL implements AfterViewInit {
ngAfterViewInit() {
componentHandler.upgradeAllRegistered();
}
}
Luego, en su componente, importe y registre
import { Component } from ''@angular/core'';
import { MDL } from ''../../../directives/MaterialDesignLiteUpgradeElement'';
@Component ({
selector: ''my-component'',
directives: [ MDL ],
templateUrl: ''app/components/Header/Header.html''
})
export class Header {
public dynamicArray:number[] = [];
add() {
this.dynamicArray.push(Math.round(Math.random() * 10));
}
}
Y en su plantilla agregue
mdl
al componente raíz
<header mdl class="mdl-layout__header">
<div class="mdl-layout__header-row">
<span class="mdl-layout-title">Home</span>
<div class="mdl-layout-spacer"></div>
<button class="mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--icon"
(click)="add()">
<i class="material-icons">add</i>
</button>
<button class="mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--icon" id="hdrbtn">
<i class="material-icons">more_vert</i>
</button>
<ul class="mdl-menu mdl-js-menu mdl-js-ripple-effect mdl-menu--bottom-right" for="hdrbtn">
<li class="mdl-menu__item">Static entry</li>
<!-- semi dynamic, known when view is created -->
<li class="mdl-menu__item" *ngFor="#nr of [1,2,3]">Semi Dynamic entry {{nr}}</li>
<!-- dynamic, depends on service manipulated array -->
<li class="mdl-menu__item" *ngFor="#nr of dynamicArray">Dynamic entry {{nr}}</li>
</ul>
</div>
</header>
Puedo obtener la solución del canal angualrjs, y es una solución súper genial, de origen tenemos que usar
componentHandler.upgradeElement(this.elementRef.nativeElement);
// Esta es la forma de hacer
@Directive({
selector: ''[mdlUpgrade]''
})
class MdlUpgradeDirective {
@Input() mglUpgrade;
constructor(el: ElementRef) {
componentHandler.upgradeElement(el.nativeElement);
}
}
@Component ({
selector: ''login'',
...
directives: [MdlUpgradeDirective]
})
y use la Directiva sobre las etiquetas HTML para usarla.
Funciona,
NOTA: https://github.com/justindujardin/ng2-material , estos muchachos han hecho material súper genial, también pueden referir esto
Solo pensé que vale la pena mencionar aquí que la biblioteca oficial de Material Design for Angular 2 ahora está en alpha.2, por lo que podría considerar comenzar nuevos proyectos con ella.
simplemente importe
ElementRef
y
OnInit
desde
angular2/core
e
angular2/core
a un constructor de la siguiente manera:
constructor(@Inject(ElementRef) elementRef: ElementRef) {
this.elementRef = elementRef;
}
luego use un método
ngOnInit
y use el
componentHandler.upgradeElement
en cualquier etiqueta agregada dinámicamente que haya utilizado.