generator-angular2-library icon indicating copy to clipboard operation
generator-angular2-library copied to clipboard

NullInjectorError: No provider for ElementRef!

Open theunreal opened this issue 7 years ago • 17 comments

When I'm simply trying to put el: ElementRef in my directive constructor and use it in my component, I get the following error:

ERROR Error: Uncaught (in promise): Error: StaticInjectorError(AppModule)[SampleDirective -> ElementRef]: 
  StaticInjectorError(Platform: core)[SampleDirective -> ElementRef]: 
    NullInjectorError: No provider for ElementRef!
Error: StaticInjectorError(AppModule)[SampleDirective -> ElementRef]: 
  StaticInjectorError(Platform: core)[SampleDirective -> ElementRef]: 
    NullInjectorError: No provider for ElementRef!

component:

template: `<div><h1 class="rotateBox" bsRotate>Test</h1></div>`,

directive:

@Directive({
  selector: '[bsRotate]'
})
export class SampleDirective {

  constructor(el: ElementRef) {
    console.log(el);
  }

}

Why i'm unable to use the element reference in my directive when generating a library?

theunreal avatar Feb 17 '18 17:02 theunreal

same here, any solution?

alan-albuquerque avatar Feb 21 '18 18:02 alan-albuquerque

Can you please post your index.ts or the file containing your @NgModule

izifortune avatar Feb 21 '18 19:02 izifortune

@izifortune This is the same file created using the cli, no changes

theunreal avatar Feb 23 '18 07:02 theunreal

As a quick test I simply renamed my directive selector to bsRotate and added it to the component markup. I did not get the error. I got other errors though. I had to restart the playground a few times. I verified the directive was applied.

It's relationed to install the library from local dir directly, when I publish the library to NPM and install from npm servers, works perfect

AlanAlbuquerque avatar Mar 03 '18 23:03 AlanAlbuquerque

Got it working by adding...

    "build": {
      "preserveSymlinks": true
    },

to defaults in .angular-cli.json file

AchiraFernando avatar Apr 03 '18 03:04 AchiraFernando

Thanks @AchiraFernando, it's working!

guybi avatar Apr 04 '18 05:04 guybi

I tried @AchiraFernando's solution and still getting the same error. I'm using Angular 5.2. Any suggestions?

nathansomething avatar Apr 18 '18 15:04 nathansomething

The paths option in tsconfig.json worked for me, after futzing around for hours.

"paths": {
  "@angular/*": ["../node_modules/@angular/*"]
}

Adding --preserve-symlinks to the build command, on the other hand, did not work for me.

rtm avatar Jun 06 '18 04:06 rtm

I tired both the above solution, but no success. I am facing following error: ERROR { Error: StaticInjectorError(AppServerModule)[NgClass -> ElementRef]: StaticInjectorError(Platform: core)[NgClass -> ElementRef]: NullInjectorError: No provider for ElementRef! at NullInjector.module.exports.NullInjector.get ngTempTokenPath: null, ngTokenPath: [ 'NgClass', [Function: ElementRef] ] } Also, i have upgraded my application from angular5 to angular 6 and trying to implement server-side rendering. Any solution?

Dmonika04 avatar Oct 03 '18 07:10 Dmonika04

Same issue with angular 7

swapnil-coditas avatar Feb 05 '19 07:02 swapnil-coditas

I had the same problem and I removed node_module folder and yarn.lock (or package-lock.json in case u are using npm) and installed dependencies again, now my problem is solved, hope it's helpful

installing dependencies by:

yarn install # or npm install

MetaiR avatar Jun 02 '19 15:06 MetaiR

Got it working by adding...

    "build": {
      "preserveSymlinks": true
    },

to defaults in .angular-cli.json file

I think "preserveSymlinks": true should be in build.options

suneric1 avatar Dec 11 '19 20:12 suneric1

"paths": {
    "@angular/*": [
        "./node_modules/@angular/*"
    ]
}

Make the paths mapping in the application's tsconfig (where you are linking to the library) and not the library one.

AshwaniChoudhary avatar Dec 19 '19 09:12 AshwaniChoudhary

Instead of using ElementRef we can use:

import { DOCUMENT } from '@angular/common';
constructor( @Inject(DOCUMENT) private doc ) {}
let [link]: HTMLLinkElement[] = this.doc.querySelectorAll(`[rel="canonical"]`);

dmitry-grinko avatar Mar 13 '20 02:03 dmitry-grinko

Instead of using ElementRef we can use:

import { DOCUMENT } from '@angular/common';
constructor( @Inject(DOCUMENT) private doc ) {}
let [link]: HTMLLinkElement[] = this.doc.querySelectorAll(`[rel="canonical"]`);

But that assumes you only have a single instance of your component?

juanmendes avatar Mar 24 '20 15:03 juanmendes

I'm seeing the same issue with Angular 8:

CardComponent.html:13 ERROR NullInjectorError: StaticInjectorError(AppModule)[LinkDirective -> ElementRef]: 
  StaticInjectorError(Platform: core)[LinkDirective -> ElementRef]: 
    NullInjectorError: No provider for ElementRef!

I've tried the following:

  • Deleting node_modules and package-lock.json and running npm install again.
  • Adding "preserveSymlinks": true to build.options in my angular.json file.
  • Updating the paths property in tsconfig.json with "@angular/*": ["../node_modules/@angular/*"].
  • Publishing my changes and loading my library from the npm library, instead of loading it locally.

... None of this worked. I can only get my attribute directive to work if I host it inside my project instead of attempting to load it as a third-party library.

I've even tried copying and pasting the attribute directive from the Angular docs as-is, without modifications, and the error still occurs.

I suspect this might be an issue with Angular itself, where attempting to load and use attribute directives from libraries simply doesn't work.

callmeaponte avatar May 22 '20 17:05 callmeaponte