2016-09-09 51 views
2

有很多关于如何将Angular 1服务和工厂转换为Angular2的文档和示例,但我无法找到关于如何将ng1提供程序转换为等价物的任何内容在ng2中。什么是将Angular 1提供程序转换为Angular 2的正确方法

例提供商

function AlertService() { 
    this.toast = false; 

    this.$get = getService; 

    this.showAsToast = function(isToast) { 
     this.toast = isToast; 
    }; 

    getService.$inject = ['$timeout', '$sce']; 

    function getService ($timeout, $sce) { 
     var toast = this.toast, 
      alertId = 0, // unique id for each alert. Starts from 0. 
      alerts = [] 

     return { 
      factory: factory, 
      add: addAlert 
     }; 

     function factory(alertOptions) { 
      var alert = { 
       type: alertOptions.type, 
       msg: $sce.trustAsHtml(alertOptions.msg), 
       id: alertOptions.alertId, 
       toast: alertOptions.toast 
      }; 
      alerts.push(alert); 

      return alert; 
     } 

     function addAlert(alertOptions) { 
      alertOptions.alertId = alertId++; 
      var alert = this.factory(alertOptions); 

      return alert; 
     } 

    } 


} 

angular 
    .module('angularApp', []) 
    .provider('AlertService', AlertService); 

什么是在2角的正确相当于这个?

+0

是什么让一个相当于比一次更好? –

+0

此时我不确定。我在互联网上找不到任何东西,因此对我来说坦率地说,相当于做了这个工作,并遵循ng2指导方针就足够了 – Deepu

回答

1

好了,所以我们终于搞明白了感谢https://github.com/jhipster/generator-jhipster/issues/3664#issuecomment-251902173

这里是NG2

import {Injectable, Sanitizer, SecurityContext} from '@angular/core'; 

@Injectable() 
export class AlertService { 

    private alertId: number; 
    private alerts: any[]; 

    constructor(private sanitizer: Sanitizer, private toast: boolean) { 
     this.alertId = 0; // unique id for each alert. Starts from 0. 
     this.alerts = []; 
    } 

    factory(alertOptions): any { 
     var alert = { 
      type: alertOptions.type, 
      msg: this.sanitizer.sanitize(SecurityContext.HTML, alertOptions.msg), 
      id: alertOptions.alertId, 
      toast: alertOptions.toast 
     }; 
     this.alerts.push(alert); 
     return alert; 
    } 

    addAlert(alertOptions, extAlerts): any { 
     alertOptions.alertId = this.alertId++; 
     var alert = this.factory(alertOptions); 
     return alert; 
    } 

    isToast(): boolean { 
     return this.toast; 
    } 
} 

的服务,这里是该服务的提供商

import { Sanitizer } from '@angular/core'; 
import { AlertService } from './alert.service'; 

export function alertServiceProvider(toast?: boolean) { 
    // set below to true to make alerts look like toast 
    let isToast = toast ? toast : false; 
    return { 
     provide: AlertService, 
     useFactory: (sanitizer: Sanitizer) => new AlertService(sanitizer, isToast), 
     deps: [Sanitizer] 
    } 
} 

现在,您需要请在模块的提供程序声明中调用alertServiceProvider方法。

@NgModule({ 
    imports: [ 
     ... 
    ], 
    declarations: [ 
     ... 
    ], 
    providers: [ 
     ... 
     alertServiceProvider() 
    ], 
    exports: [ 
     ... 
    ] 
}) 
export class SharedCommonModule {} 

的代码是JHipster项目的一部分,你可以浏览实际模板here

+0

这个工作是否与[AOT]一起工作(https://angular.io/docs/ts /latest/cookbook/aot-compiler.html)? –

+0

尚未测试,但 – Deepu

+1

我认为你需要重新组织一下,基本的方法应该仍然有效。只需将'{provide:...}'部分直接移至'@NgModule(providers:[])'(out of'alertServiceService()')。 https://github.com/qdouble/angular-webpack2-starter#aot--donts –

相关问题