ng-metadata
Angular 2 Angular 1.x的装饰器
享受/使用ngmetadata? ?✅
给我买一个☕️
互联网上的某人:
最好的角1!后端口几乎所有Angular 2 API到Angular 1,Woot!
NG-Metadata是希望使用Angular 2约定和样式在Angular 1.4+上运行的Angular 2约定和样式的人,这是一个很好的解决方案。
没有黑客。没有覆盖。准备就绪。
升级您的代码库真的很容易且非常灵活,您可以采用3种策略:
- 通过
angular.module进行注册的每个文件升级 - 每个文件升级使用root App组件上的注册
@ComponentMetadata通过providers/directive/pipes - 混合方法可以结合两种类型
ng-metadata的优势:
- 干净的Angular 2样式DI与Angular 1
- 如今,以Angular 2样式编写您的应用程序,并提高生产力!
- 删除Angular 1 API的开销,如链接函数,$ scope,$ element和not and not and and not and其他奇怪的API语法
- 没有抽象,只有纯Angular 1.x在ES的引擎盖和力量下。
- 带领您,编写干净的组件驱动代码,而无需复杂的DDO定义API
- “力”您将应用程序视为组成树,在Angular 2术语中
在幕后使用ES.NEXT装饰器通过Typescript扩展(添加了方法装饰器,参数装饰器等...)
参数装饰器现在位于TC39中的0阶段,因此可能很快就会在Babel中使用,因此,如果您喜欢纯JS,则可以使用ES2015使用所有这些好处
快速开始
- plunkr-在浏览器中尝试一下
- 游乐场 - 实时文档示例和强制性待办事项示例
- 生产Ready入门套件 - NGPARTY TEAM由WebPack提供支持的入门套件
学习
- 在执行任何操作之前,请阅读Boottapping指南以进行广泛概述如何做事
- 浏览文档
- 如何将ES5迁移到打字稿+NG-Metadata:设计模式/食谱
- 检查常见问题是否有更多说明
要点
那么,旧学校ES5 Angular 1应用程序和现代NG-Metadata应用程序有什么区别?
我很高兴你问!这是一个小型比较应用:
具有ES5的角1.x:
// main.js
angular . element ( document ) . ready ( function ( ) {
angular . bootstrap ( document , [ 'hero' ] ) ;
} ) ;
// hero.js
angular . module ( 'hero' , [ ] ) ;
// hero.service.js
angular . module ( 'hero' )
. service ( 'heroSvc' , HeroService ) ;
HeroService . $inject = [ '$http' ] ;
function HeroService ( $http ) { this . $http = $http ; }
HeroService . prototype . fetchAll = function ( ) {
return this . $http . get ( '/api/heroes' ) ;
}
// hero.component.js
angular . module ( 'hero' )
. directive ( 'hero' , heroCmp ) ;
function heroCmp ( ) {
return {
scope : { } ,
bindToController : {
name : '=' ,
onCall : '&'
} ,
controller : HeroController ,
controllerAs : '$ctrl' ,
link : function ( scope , element , attrs , ctrl ) {
ctrl . init ( ) ;
} ,
transclude : true ,
templateUrl : 'hero.html'
} ;
}
HeroController . $inject = [ 'log' , 'heroSvc' ] ;
function HeroController ( $log , heroSvc ) {
this . init = function ( ) { /* your init logic */ } ;
}ng-metadata和打字稿:
// main.ts import { platformBrowserDynamic } from 'ng-metadata/platform-browser-dynamic' ; import { AppModule } from './app.module' ; platformBrowserDynamic ( ) . bootstrapModule ( AppModule ) ; // app.module.ts import { NgModule } from 'ng-metadata/core' ; import { AppComponent } from './app.component' ; import { HeroComponent } from './hero.component' ; import { HeroService } from './hero.service' ; @ NgModule ( { declarations : [ AppComponent , HeroComponent ] , providers : [ HeroService ] } ) export class AppModule { } // app.component.ts import { Component } from 'ng-metadata/core' ; @ Component ( { selector : 'my-app' , template : `` } ) export class AppComponent { name = 'Martin' ; onCall ( ) { /*...*/ } } // hero.service.ts import { Injectable , Inject } from 'ng-metadata/core' ; @ Injectable ( ) export class HeroService { constructor ( @ Inject ( '$http' ) private $http : ng . IHttpService ) { } fetchAll ( ) { return this . $http . get ( '/api/heroes' ) ; } } // hero.component.ts import { Component , Inject , Input , Output , EventEmitter , OnInit } from 'ng-metadata/core' ; import { HeroService } from './hero.service' ; @ Component ( { selector : 'hero' , moduleId : module . id , templateUrl : './hero.component.html' , legacy : { transclude : true } } ) export class HeroComponent implements OnInit { // one way binding determined by parent template @ Input ( ) name : string ; @ Output ( ) call = new EventEmitter < void > ( ) ; constructor ( // we need to inject via @Inject because angular 1 doesn't give us proper types @ Inject ( '$log' ) private $log : ng . ILogService , // here we are injecting by Type which is possible thanks to reflect-metadata and TypeScript and because our service // is defined as a class private heroSvc : HeroService ) { } ngOnInit ( ) { /* your init logic */ } }
安装
先决条件:node.js
通过在终端/控制台窗口中运行
node -v和npm -v,验证您至少正在运行Node V5.xx和NPM 3.xx。较旧的版本可能会产生错误。
依赖性
具有NG-Metadata的角度应用取决于各种第三方软件包(包括NG-Metadata本身)提供的功能和功能。这些软件包由Node软件包管理器(NPM)维护和安装。
所有这些依赖项都将存储在package.json中。
应用程序软件包的依赖项部分中有三个软件包类别。
功能- 功能软件包为我们的应用程序提供框架和实用程序功能。
polyfills-浏览器JavaScript实现中的Polyfills插入间隙。
其他支持该应用程序的库,例如HTML小部件和样式等的Bootstrap ...
功能软件包
Angular-没有角度的生活,对吗? :d
Angular Mocks - 您正在测试您的代码吗?正确的?
NG-Metadata-每个应用程序都需要NG-Metadata的关键运行时部分。包括所有元数据装饰器,组件,指令,依赖注入和组件生命周钩。包括4个模块:
-
ng-metadata/core, -
ng-metadata/platform-browser-dynamic, -
ng-metadata/common, -
ng-metadata/testing
通过运行来安装核心依赖性:
npm i --save angular angular-mocks ng-metadata
多填充软件包
NG-Metadata需要在应用程序环境中进行某些聚填充。我们安装了这些多填充物,其中包括非常具体的NPM软件包,NG-Metadata在其package.json的peerDepentencies段中列出了这些填充程序。
通过运行安装同伴依赖性:
npm i --save rxjs@5.0.1
RXJS-目前在TC39委员会面前的可观察到规格的多填充,该规范确定了JavaScript语言的标准。开发人员应该能够选择RXJS的首选版本(在兼容版本范围内),而无需等待NG-Metadata更新。
通过运行安装polyfills:
npm i --save core-js
您还需要提供Reflect.metadata垫片。这可以通过安装npm i --save reflect-metadata或从core-js import 'core-js/es7/reflect'来完成。
Core -JS-猴子通过ES2015(ES6)的基本特征对全局上下文(窗口)进行修补。开发人员可以代替提供相同核心API的替代多填充。一旦所有受支持的绿色浏览器实施这些API,这种依赖性就应该消失。
Reflect-Metadata- NG-Metadata和Typescript编译器之间共享的依赖关系。开发人员应该能够在不升级NG-Metadata的情况下更新打字稿软件包,这就是为什么这是应用程序的依赖性,而不是NG-Metadata的依赖性。
配置您的项目
TypeScript是NG-Metadata的角度应用开发的主要语言。
浏览器无法直接执行打字稿。必须使用TSC编译器“将”“转录”到JavaScript中,并且需要进行一些配置。
我们需要3件事:
- TSCONFIG.JSON-打字稿编译器配置。
- 键入 - Typesscript声明文件。
- 模块加载器/捆绑器-ES2015模块在浏览器中不在本地中,因此我们需要一个工具
tsconfig.json
打字稿编译器配置
我们通常将打字稿配置文件( tsconfig.json )添加到我们的项目中,以指导编译器生成JavaScript文件。
{
"compilerOptions" : {
"target" : " es5 " ,
"module" : " commonjs " ,
"moduleResolution" : " node " ,
"sourceMap" : true ,
"experimentalDecorators" : true ,
"emitDecoratorMetadata" : true ,
"removeComments" : false ,
"noImplicitAny" : false
}
}-
module- 您可以使用任意模块编译类型,取决于您的模块Bundler,我们commonjs喜欢使用webpack
打字稿声明文件
许多JavaScript库,例如JQuery,Jasmine Testing库以及Angular本身,它们以功能和语法扩展了JavaScript环境,而Typescript Compiler无法本地识别。当编译器无法识别某些内容时,它会引发错误。
我们使用Typescript类型声明文件( D.TS文件)来告诉编译器我们加载的库。
许多库将其定义文件包括在其NPM软件包中,其中打字稿编译器和编辑人员都可以找到它们。 NG-Metadata就是这样的图书馆。
从打字稿2.0开始,安装第三方声明文件现在非常简单,可以直接从NPM完成。请参阅官方指南以获取更多信息:https://www.typescriptlang.org/docs/handbook/declaration-files/consumption.html。
TypeScript 2将自动包含编译中@Types名称空间下的任何已安装软件包。对于NG-Metadata项目,我们将需要以下声明文件:
-
npm install --save @types/core-js// core-js的es2015/es6 shim nock nocke nocke nocke nocky nocke nocky nocky nocke nocky nocke nocky(eS6)的基本功能,对全局上下文(窗口)进行修补 -
npm install --save @types/node// for nodejs环境中引用对象的代码 -
npm install --save @types/jquery//我们需要它以适当地键入Angular Jqlite -
npm install --save @types/angular// Angular 1类型定义,因此您可以获得Angular 1 API类型检查 -
npm install --save @types/angular-mocks//对单元测试的打字支持
模块装载机 /捆绑器
我们更喜欢webpack ,但您也可以使用SystemJS ,这使我想起了Requirejs配置地狱,但是是的,这取决于您;)
- 有关WebPack配置,请参见我们的Angular 1入门
- 有关SystemJS配置
就是这样!你很好!
为什么?
这些只是我制作ng-metadata的几个原因。
ng-metadata:
- 可以用作升级策略的一部分,当迁移到Angular 2时,该策略也可能包括NG-Upgrade
- 在引擎盖下仅使用纯Angular 1 API
- 模板与Angular 1 +中的绑定类型相同(ng2 like)确定
- 支持各种Angular 1 API,例如创建提供商/配置/Runblocks等等
支持
需要帮助吗?
跳入NGPARTY SLACK团队参加讨论...
认为您找到了一个错误?
首先检查问题列表,以查看其他人是否已经找到了它,并且正在进行讨论。如果没有,请提交问题。谢谢!
为该项目做出贡献
我们想要帮助!请查看指南的贡献指南,然后跳入Slack团队,讨论您如何提供帮助:http://ngparty.slack.com ...如果您不是成员,请加入我们
通过命令行克隆项目: