2 votes

Configuration d'une directive dans Angular 6

Il semble que je ne puisse pas faire fonctionner les directives dans mon application. Je n'obtiens aucune erreur et lorsque je reproduis dans stackblitz, cela fonctionne bien. J'étais j'ai eu ce problème il y a un certain temps lorsque j'ai essayé d'implémenter cette directive pour la première fois, j'ai hésité en disant que c'était en fait un problème dans mon application avec les "directives personnalisées" elles-mêmes... personne n'a fini par répondre à cette question. Je viens maintenant vers vous avec plus d'informations.

Faites-moi savoir. Voyez-vous quelque chose qui ne va pas dans ma configuration ? Qu'est-ce qui me manque ? J'ai l'impression d'avoir tout essayé.

Voici ce que j'ai essayé :

Travaux dans Stackblitz : Je sais comment faire une directive .

Mais cette directive très simple ne fonctionne pas dans mon application (voir le code en bas) (précision : ne fonctionne pas = je ne vois pas le console.log ou l'attribut que la directive shadow est censée appliquer)... Modèle : enter image description here Directive : enter image description here Module : enter image description here J'ai essayé de le déclarer dans le module le plus proche comme ci-dessus, mais j'ai aussi essayé dans app.module. De plus, j'ai essayé d'importer par le biais d'un module dédié (je ne pense pas avoir besoin de l'exportation mais cela ne devrait pas faire de mal). Module dédié : enter image description here

Modèle :

<!-- <div #windowsnap class="blade-container" (mouseup)="BladeSnappiness()" (mousedown)="CloseSidebar()"> -->
<div #windowsnap class="blade-container" windowsnap>
  <!-- level 1 -->
  <org-management-blade *ngIf="level1 === 'orgBlade'"> </org-management-blade>
  <org-profile *ngIf="level1 === 'orgProfile'"> </org-profile>

  <!-- level 2 -->
  <org-setup *ngIf="level2 === 'orgSetup'"></org-setup>

  <!-- level 3 -->
  <org-create-admin *ngIf="level4 === 'orgCreateAdmin'"></org-create-admin>
  <org-new-security-profile *ngIf="level4 === 'newSecProfile'"></org-new-security-profile>
  <org-railroad-filter *ngIf="level4 === 'newSecRailroadFilter'"></org-railroad-filter>

  <!-- level 4 -->
  <org-security-permissions *ngIf="level5 === 'newSecPerms'"></org-security-permissions>

  <!-- level 5 -->

</div>

Directive :

import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';

@Directive({ selector: '[windowsnap]' })
export class ShadowDirective {
    constructor(elem: ElementRef, renderer: Renderer2) {
        renderer.setStyle(elem.nativeElement, 'background-color', 'blue');
    }

    @HostListener('mouseenter') CloseSidebar() {
        console.log('windowsnap directive');
    }
}

Module :

 @NgModule({
  imports: [
    CommonModule,
    ReactiveFormsModule,
    ScrolltocomponentModule,
    MaskedTextBoxAllModule,
    AgGridModule,
    // ShadowModule
  ],
  providers: [
  ],
  declarations: [
    OrgManagementComponent,
    OrgManagementBladeComponent,
    OrgSetupComponent,
    OrgInfoComponent,
    OrgAdminsComponent,
    OrgSecurityProfilesComponent,
    OrgRailroadFilterComponent,
    OrgSecurityPermissionsComponent,
    OrgNewSecurityProfileComponent,
    OrgCustMappingComponent,
    OrgCreateAdminComponent,
    OrgProfileComponent,
    ShadowDirective
  ]
})
export class OrgManagementModule { }

Module dédié :

import { ShadowDirective } from './shadow.directive';
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

@NgModule({
    imports: [
        CommonModule
    ],
    declarations: [
        ShadowDirective
    ],
    providers: [
    ],
    exports: [
        ShadowDirective
    ]
})
export class ShadowModule { }

package.json :

{
  "name": *omitted*,
  "version": "0.0.1",
  "scripts": {
    "ng": "ng",
    "start": "ng serve --ssl true",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e",
    "dev": "babel-watch server.js",
    "compodoc": "./node_modules/.bin/compodoc -p src/tsconfig.app.json"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "^6.0.1",
    "@angular/common": "^6.0.1",
    "@angular/compiler": "^6.0.1",
    "@angular/core": "^6.0.1",
    "@angular/elements": "^6.0.6",
    "@angular/forms": "^6.0.1",
    "@angular/http": "^6.0.1",
    "@angular/platform-browser": "^6.0.1",
    "@angular/platform-browser-dynamic": "^6.0.1",
    "@angular/platform-server": "^6.0.1",
    "@angular/router": "^6.0.1",
    "@microsoft/microsoft-graph-types": "1.3.0",
    "@nguniversal/module-map-ngfactory-loader": "^6.0.0",
    "@syncfusion/ej2-ng-inputs": "^16.2.53",
    "ag-grid": "^18.1.2",
    "ag-grid-angular": "^18.1.0",
    "ag-grid-enterprise": "^18.1.1",
    "angular2-uuid": "^1.1.1",
    "aspnet-prerendering": "^3.0.1",
    "core-js": "^2.5.6",
    "document-register-element": "^1.7.2",
    "powerbi-client": "^2.6.4",
    "rxjs": "^6.1.0",
    "rxjs-compat": "^6.1.0",
    "syncfusion-javascript": "^16.3.22",
    "touch": "^3.1.0",
    "zone.js": "^0.8.26"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.6.1",
    "@angular-devkit/build-ng-packagr": "~0.6.8",
    "@angular/cli": "~6.0.1",
    "@angular/compiler-cli": "^6.0.1",
    "@angular/language-service": "^6.0.1",
    "@azure/msal-angular": "^0.1.2",
    "@compodoc/compodoc": "^1.1.5",
    "@types/jasmine": "~2.8.6",
    "@types/jasminewd2": "~2.0.3",
    "@types/node": "~8.9.4",
    "codelyzer": "~4.2.1",
    "jasmine-core": "~2.99.1",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "^2.0.2",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~1.4.2",
    "karma-jasmine": "~1.1.1",
    "karma-jasmine-html-reporter": "^0.2.2",
    "msal": "^0.2.3",
    "ng-packagr": "^3.0.0-rc.2",
    "protractor": "^5.4.0",
    "ts-node": "~5.0.1",
    "tsickle": ">=0.25.5",
    "tslib": "^1.7.1",
    "tslint": "~5.9.1",
    "typescript": "~2.7.2"
  }
}

stackblitz package.json

@angular/common5.0.0
@angular/compiler5.0.0
@angular/core5.0.0
@angular/forms5.0.0
@angular/platform-browser5.0.0
@angular/platform-browser-dynamic5.0.0
@angular/router5.0.0
@ng-bootstrap/ng-bootstrap1.0.0
core-js2.5.1
rxjs5.5.2
zone.js

2voto

Sunil Singh Points 6167

Il est assez facile de déboguer pour savoir si la directive est active ou non.

Utiliser les crochets dans les directives en html. Changez ceci

<div #windowsnap class="blade-container" windowsnap>

à

<div #windowsnap class="blade-container" [windowsnap]>

Si Directive n'est pas enregistré correctement, Angular entraînera l'erreur suivante

windowsnap est une propriété inconnue..

Si vous obtenez cette erreur, il suffit de déclarer le Directive au plus proche Module .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X