2017-07-16 225 views
2
package.json 

{ "version": "1.0.0", 
    "name": "basic-app", 
    "devDependencies": { "typescript": "^2.4.1" }, 
    "dependencies": { 
    "@angular/core": "2.4.5", 
    "@angular/platform-browser": "2.4.5", 
    "@angular/platform-browser-dynamic": "2.4.5", 
    "@angular/common": "2.4.5", 
    "@angular/compiler": "2.4.5", 
    "@angular/http": "2.4.5", 
    "rxjs": "5.0.1", 
    "zone.js": "^0.7.2", 
    "systemjs": "0.19.40", 
    "core-js": "^2.4.1" 
}} 

tsconfig.json 

{ "compilerOptions": { 
    "target": "es5", 
    "module": "commonjs", 
    "moduleResolution": "node", 
    "sourceMap": true, 
    "experimentalDecorators": true, 
    "emitDecoratorMetadata": false, // set to false 
    "lib": ["es2015", "dom"], 
    "noImplicitAny": true, 
    "suppressImplicitAnyIndexErrors": true 
}} 

index.html 

<!DOCTYPE html> 
<html> 
<head> 
<script src="node_modules/core-js/client/shim.min.js"></script> 
<script src="node_modules/zone.js/dist/zone.js"></script> 
<script src="node_modules/systemjs/dist/system.src.js"></script> 
<script src="src/systemjs.config.js"></script> 
<script> 
    System.import('main').catch(function(err) { 
     console.error(err); 
    }); 
</script> 
</head> 
<body> 
    <my-app>Loading</my-app> 
</body> 
</html> 

該代碼似乎工作正常,當我在瀏覽器中運行它;我沒有包含反映metadata.js,也沒有在tsconfig.json中包含emitDecoratorMetadata屬性;所以reflectmetadata.js和emitDecoratorMetadata在angular2中是可選的?請讓我知道爲什麼上面的代碼仍然在瀏覽器中工作。任何幫助是極大的讚賞。角度是否需要reflectmetadata.js和emitDecoratorMetadata:true?

https://embed.plnkr.co/?show=preview&show=app%2Fapp.component.ts角樣本代碼不包括反映metadata.js

回答

2

emitDecoratorMetadata

需要此設置如果使用類型被設置爲作爲true令牌是這樣的:

constructor(dependency: ClassName) {} 

如果設置爲true,編譯器會生成以下代碼:

AppComponent = __decorate([ 
    core_1.Component({ 
     selector: 'my-app', 
     ... 
    }), 
    __metadata("design:paramtypes", [core_1.Injector]) 
             ^^^ 
         here the type for token is referenced 

如果您只使用@Inject()修飾器,那麼您不需要設置emitDecoratorMetadata

反映元

這個包本身通常不要求,因爲它納入core.js由角要求:

<script src="node_modules/core-js/client/shim.min.js"></script> 
+1

偉大的答案。沒有意識到它正在使用_decorate()函數。以爲它會使用Class.name或其他東西 – Ryan