Próbuję zaimportować komponent niestandardowy w mojej aplikacji.ts, ale pojawia się błąd "TS2307: Nie można znaleźć modułu" MyComponent "" Sprawdziłem to, nie mogłem znaleźć niczego, co by mi pomogło.Nie można zaimportować komponentu użytkownika - Angular2 i TypeScript
Niektórzy ludzie napisali: użyć "moduleResolution": "classic", ale jeśli to zrobię, otrzymam błąd TS2307 dla wszystkiego innego (wszystkie kątowe2/...) z wyjątkiem MyComponent.
Inni napisali "run tsc --declaration MyComponent.ts" - który generuje plik MyComponent.d.ts (podczas gdy wyrzucanie błędów w konsoli, np. "Nie można skompilować, chyba że podano flagę --module" - która IS jest dostarczany w tsconfig jako opcja - lub "Can not find module" angle2/common "" dla tego, co importuję w MyComponent.ts - ale generuje plik .d.ts), ale gdy próbuję skompilować app.ts to nadal daje ten sam błąd TS2307. Nohting, które znalazłem, działało.
To jest mój struktury projektu:
| /app
| /resources
| /dev
| /ts
| app.ts
| MyComponent.ts
| /dist
| /js
| app.js // transcompiled app.ts
| MyComponent.js // transcompiled MyComponent.ts
| /modules // files copied from the /node_modules/**/ folders (because node_modules is outside versioning and also outside public root (public root is the /app folder)
| es6-shim.js
| angular2-polyfills.js
| system.src.js
| Rx.js
| http.dev.js
| angular2.dev.js
| index.html
|
| /node_modules
| /angular2 // 2.0.0-beta.1
| /es6-promise // 3.0.2
| /es6-shim // 0.33.3
| /rxjs // 5.0.0-beta.0
| /reflect-metadata // 0.1.2
| /systemjs // 0.19.6
| /zone.js // 0.5.10
|
To mój tsconfig.json:
{
"compilerOptions": {
"target": "ES5",
"module": "system",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": true,
"noImplicitAny": false,
"outDir": "app/resources/dist/js"
},
"files": [
"app/resources/dev/ts/app.ts"
]
}
Moi app.ts:
import { bootstrap } from "angular2/platform/browser";
import { Component, View } from "angular2/core";
import { HTTP_PROVIDERS, Http, Response } from "angular2/http";
//My Custom Components:
import { MyComponent } from 'MyComponent';
/**
* APP
*/
@Component({
selector: 'my-app'
})
@View({
directives: [MyComponent],
template: `
<my-component></my-component>
plus other html
`
})
class MyApp {
public whatever;
constructor(public http: Http) {
// initialize this.whatever
}
makeRequest(): void {
this.http.request('/_http/response.json')
.subscribe((res:Response) => {
this.whatever = res.json();
});
}
}
bootstrap(MyApp, [ HTTP_PROVIDERS ]);
A oto moja Mój Component.ts:
import { Component } from 'angular2/core';
import { NgFor, NgIf } from 'angular2/common';
@Component({
selector: 'my-component',
template: `
<div>MY IMPORTED COMPONENT</div>
`
})
export class MyComponent {
constructor() {}
doSomething(): void {
console.log('Doing something');
}
}
Moi app.ts i MyComponent.ts są zarówno w tym samym folderze. Tak czy inaczej, wypróbowałem również taką ścieżkę: import {MyComponent} z "/ app/resources/dev/ts/MyComponent". Próbowałem też dodać go do tablicy plików w tsconfig (niektórzy ludzie napisali, że powinienem to zrobić) ... Wciąż ... Nic nie działało! Sprawdziłem również wyjście js, ponieważ niektórzy ludzie napisali, że mimo tego, że to powoduje błąd, nadal może być skompilowany ... Bez powodzenia!
====================
EDIT:
Ok, jak inoabrian sugeruje w pierwszym komentarzu ... Myślałem Próbowałam wszystko, ale wydaje się, że nie próbowałem "./MyComponent" dla części importu.
import { MyComponent } from './MyComponent';
Teraz transcompiler wykonuje swoją pracę. Dziękuję, Inoabrian, ale teraz mam inny problem. Kiedy próbuję działa w przeglądarce, mogę sprawdzić konsolę i oba systemjs i angular2-pollyfills krzyczeć:
http://my-app/resources/dist/js/MyComponent 404 (Not Found)
odpowiednio:
XHR error (404 Not Found) loading http://my-app/resources/dist/js/MyComponent(…)
Nie być wyrzucony przez ścieżkę (porównując do moja struktura folderów projektu), mam lokalny serwer wskazujący na/app, gdy uzyskuję dostęp do http://my-app
To jest mój indeks .html z konfiguracji systemu i wszystko wliczone js pliki:
<!DOCTYPE html>
<html lang="en">
<head>
<!-- ... Meta tags & CSS assets -->
<script src="resources/dist/modules/es6-shim.js"></script>
<script src="resources/dist/modules/angular2-polyfills.js"></script>
<script src="resources/dist/modules/system.src.js"></script>
<script src="resources/dist/modules/Rx.js"></script>
<script src="resources/dist/modules/http.dev.js"></script>
<script src="resources/dist/modules/angular2.dev.js"></script>
</head>
<body>
<script>
System.config({
packages: {
app: {
format: 'register',
defaultExtension: 'js'
}
}
});
System.import('resources/dist/js/app.js')
.then(null, console.error.bind(console));
</script>
<my-app></my-app>
</body>
</html>
mam wrażenie, że muszę zrobić jeszcze jedną rzecz z transcompiled plik „MyComponent.js”, ale nie wiem co (Próbowałam dodać go do System.import, mając nadzieję, że zaakceptuje tablicę ... ale wygląda na to, że tak nie jest). Co powinienem zrobić dalej?
P.S. Jest to jednak niezadowalające, miałem nadzieję, że importowanie MyComponent do app.ts będzie wszystkim i że znajdę klasę MyComponent + wszystko z MyComponent.ts + mój skompresowany plik app.ts ALL IN ONE plik app.js, nie mający kolejny plik js :(
Czy zmieniłeś lokalizację importu na "./MyComponent"? – inoabrian
Myślałem, że próbowałem wszystkiego, ale wygląda na to, że nie. To działało z "./MyComponentem" ... ale teraz sprawy podnoszą inny problem, zredagowałem moje pytanie i dodałem problem pod koniec, po "EDYTOWANIE:" – MrCroft
Ta część wydaje się być problemem katalogowym z twoim serwerem . Może się to zdarzyć, gdy masz zagnieżdżone katalogi dla programowania i dystrybucji. Czy mógłbyś napisać, jak wygląda twój kod po stronie serwera ...? biegnę od Lite-serwer i ustawić moje katalogi mają być podawane poprzez tablicę [ ] – inoabrian