4
votes

I tried to access a custom built html using templateUrl in Angular2.

Here is my login.component.ts

import {Component} from '@angular/core';

@Component({
    selector: 'login' ,
    templateUrl : './login.component.html' 
})

export class loginComponent{

}

Here is my login.component.html

<div class="container">
    <input type="text" placeholder="username">
    <input type="text" placeholder="password">
    <button>Login</button>
</div>

My directory structure has both the login.component.ts and login.component.html both in the same location.

When I compile this code I am getting an error stating

localhost:8081/login.component.html not found 404

Unhandled Promise rejection: Failed to load login.component.html ; Zone: ; Task: Promise.then ; Value: Failed to load login.component.html undefined

6
Is login.component.html at root level? You're getting a 404, meaning it can't find the page at localhost:8081/login.component.html. - Obsidian Age
it is under a subdirectory called /login/login.component.html - skid
i even tried to give the templateUrl : './../login/login.component.html' still getting the same error - skid
Are u using webpack or SystemJS ? - Jorawar Singh
i am using webpack - skid

6 Answers

5
votes

you need config your app to using relative url

tsconfig.json

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    //... other options
  }
}

login.component.ts

import {Component} from '@angular/core';

@Component({
    moduleId: module.id,    // fully resolved filename; defined at module load time
    selector: 'login' ,
    templateUrl : './login.component.html' 
})

export class loginComponent{

}

The key lesson is to set the moduleId : module.id in the @Component decorator! Without the moduleId setting, Angular will look for our files in paths relative to the application root.

And don’t forget the "module": "commonjs" in your tsconfig.json.

The beauty of this component-relative-path solution is that we can (1) easily repackage our components and (2) easily reuse components… all without changing the @Component metadata.

https://blog.thoughtram.io/angular/2016/06/08/component-relative-paths-in-angular-2.html

3
votes

For developers using Webpack and facing this problem.

I resolved this issue by replacing:

loaders: ['awesome-typescript-loader', 'angular2-template-loader?keepUrl=true']

To:

loaders: ['awesome-typescript-loader', 'angular2-template-loader']
1
votes

(Posted on behalf of the OP).

Solved this issue by using

require('./login.component.html')

under my templateurl.

0
votes

Generally this type of errors comes because of the Angular could not find the specified path. I have solved this issue by changing the html file path in my templateUrl in @Component.

0
votes

Use this:

template: require('./login.component.html')
0
votes

You can pass your component using require()

for. e.g. template: require('./details.component.html')