J'ai un petit problème dans l'intégration d'une conception métrique ( http://www.getmdl.io/ ) dans ng2 Pouvez-vous m'aider s'il vous plaît je vais le mettre en points ce que j'ai fait
<!-- 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 -->
Et dans le fichier 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,
})
Je suis en mesure d'obtenir la solution du canal angualrjs, et c'est une solution super cool, ofource nous devons utiliser componentHandler.upgradeElement(this.elementRef.nativeElement);
// C'est la façon de faire
@Directive({
selector: '[mdlUpgrade]'
})
class MdlUpgradeDirective {
@Input() mglUpgrade;
constructor(el: ElementRef) {
componentHandler.upgradeElement(el.nativeElement);
}
}
@Component ({
selector: 'login',
...
directives: [MdlUpgradeDirective]
})
et utiliser la directive sur les balises HTML pour l'utiliser.
Ça marche,
REMARQUE: https://github.com/justindujardin/ng2-material , ce gars a fait des trucs de matériel super cool, peut aussi se référer à cela
Merci les gars, ça fonctionne comme un charme, pour conclure cette solution complète, qui fonctionne bien pour moi (testé avec beta6). Sans trop de code passe-partout. La seule chose que je n'ai pas pu travailler, ce sont des éléments ajoutés de manière dynamique via *ngFor
selon une variable de composant. Voir dynamic elements
dans le modèle. Peut-être que l'un de vous sait comment contourner cela.
Voir un fonctionnement plunkr (l'aperçu doit être au moins 1024px large pour voir l'en-tête)
Installer MDL
npm i material-design-lite --save
Référencez-le dans votre 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">
Créer MaterialDesignLiteUpgradeElement.ts
import {Directive, AfterViewInit} from 'angular2/core';
declare var componentHandler: any;
@Directive({
selector: '[mdl]'
})
export class MDL implements AfterViewInit {
ngAfterViewInit() {
componentHandler.upgradeAllRegistered();
}
}
Ensuite, importez votre composant et enregistrez-le
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));
}
}
Et dans votre modèle, ajoutez mdl
au composant racine
<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>
Le problème est que Material Design Lite n'est pas conçu pour être utilisé avec des pages dynamiques comme celles générées par Angular2. Cela dit, cela devrait être possible en utilisant la fonction MDL componentHandler.upgradeElement
.
Plus d'informations à ce sujet peuvent être trouvées ici: http://www.getmdl.io/started/#dynamic
Je suggère d'obtenir un ElementRef
dans vos composants Angular, puis d'appeler cette fonction sur l'élément ref dans l'un de vos hooks de cycle de vie des composants, probablement ngAfterViewInit()
J'étais confronté au même problème (car j'utilise le même modèle que vous).
Essayez simplement componentHandler.upgradeAllRegistered()
cela fonctionnera bien dans votre cas.
Un problème différent se produit lorsque vous essayez de diviser l'en-tête en petits composants.
J'ai pensé qu'il valait la peine de mentionner ici que la bibliothèque officielle Material Design for Angular 2 est maintenant en alpha.2, vous pouvez donc envisager de démarrer de nouveaux projets avec elle.
il suffit d'importer ElementRef
et OnInit
depuis angular2/core
et l'injecter à un constructeur comme suit:
constructor(@Inject(ElementRef) elementRef: ElementRef) {
this.elementRef = elementRef;
}
puis utilisez une méthode ngOnInit
et utilisez le componentHandler.upgradeElement
sur toute balise ajoutée dynamiquement que vous avez utilisée.
Le ng2-webpack Projet de démonstration comprend une application ng2 CRUD simple qui utilise Vanilla MDL
ngAfterViewInit() {
// Ensure material-design-lite effects are applied
componentHandler.upgradeDom();
}
voir Travailler avec Material Design Lite pour plus de détails.