把Angular 1的提供商转换成Angular 2的正确方法是什么?
What is the correct way to convert an Angular 1 provider to Angular 2
有很多关于如何将Angular 1的服务和工厂转换为Angular2的文档和示例,但我找不到任何关于如何将ng1的提供程序转换为ng2中的等效内容的文档和示例。
示例提供程序
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);
在Angular 2中,它的正确等价是什么?
多亏了https://github.com/jhipster/generator-jhipster/issues/3664#issuecomment-251902173
我们终于算出来了以下是NG2中的Service
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项目的一部分,您可以在这里浏览实际的模板
相关文章:
- 如何在Angular单元测试中从另一个控制器的rootScope将方法添加到rootScope中
- 如何防止Angular方法多次激发
- 如何避免在angular上多次调用方法;s ng重复
- 他们是如何使用angular/jqLite find()方法按属性名称和值选择元素的?ng conf 2015
- 当输入字段为空时,如何在angular中调用方法
- Angular:如何在状态更改时调用scope方法
- 向通过ReST JSON调用生成的Angular Javascript对象添加方法
- 如何从其他方法访问Angular.js$scope
- 在Angular JS中POST后重新加载指令方法
- Angular Provider/JS-如何访问'叔叔方法'从$http().then()
- 什么'是从对象列表中一次编辑一个对象的正确Angular/Firebase方法
- 有没有一种方法可以使用angular中的$index作为ng重复中的模型
- 有没有一种方法可以基于Angular 2中注册的路线构建动态导航/菜单
- 为什么我在 Angular JS 中收到两个方法调用
- 如何在Angular方法中处理下面的jQuery
- 角度ng-repeat不更新,当使用jQuery内部指令调用Angular 方法时
- 美元http.angular方法中的Get方法没有按预期工作
- 当弹出页面加载时,在chrome扩展弹出页面中调用angular方法
- 向Angular方法中添加动态变量似乎行不通
- 如何调用绑定在ng-click上的Angular方法?