ng metadata

2025-12-07 0 695

ngmetadata

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组件上的注册@Component Metadata通过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 : `<hero [name]=\"$ctrl.name\" (call)=\"$ctrl.onCall($event)\"></hero>`
} )
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 -vnpm -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 …如果您不是成员,请加入我们

下载源码

通过命令行克隆项目:

git clone https://github.com/ngParty/ng-metadata.git

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 开发教程 ng metadata https://www.zuozi.net/31782.html

jolliest vagrant
上一篇: jolliest vagrant
teaweb build
下一篇: teaweb build
常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务