【发布时间】:2017-08-15 14:52:43
【问题描述】:
我正在尝试在 Angular 2 环境中重用用纯 JavaScript 编写的 AngularJS 1 服务中的一些工作代码。
例如,服务看起来像以下示例:
(function () {
angular.module('myapp.mysubmodule').factory('myappMysubmoduleNormalService', ['someOtherService',
function (someOtherService) {
var internalState = {
someNumber: 0
};
var service = {};
service.someFunction = function () {
internalState.someNumber++;
};
someOtherService.getValues().forEach(function (v) {
service[v] = function () {
console.log(v + internalState.someNumber);
};
});
return service;
}]);
})();
我找到了各种如何将 AngularJS 1 服务转换为 Angular 2 服务的示例(例如 this one),所有这些都有一个共同点,即我必须导出一个类,而不是服务工厂。
这个应该大致如下:
import { Injectable } from '@angular/core';
@Injectable()
export class myappMysubmoduleNormalService {
someFunction: function () {
// ?
}
}
现在,问题是如何合并内部状态和动态添加的属性。 这真的是在构造函数中完成所有这些的方法吗,即在初始化时填充类的每个实例,如下所示:
import { Injectable } from '@angular/core';
@Injectable()
export class myappMysubmoduleNormalService {
constructor() {
var internalState = {
someNumber: 0
};
var service = {};
this.someFunction = function () {
internalState.someNumber++;
};
this.getValues().forEach(function (v) {
service[v] = function () {
console.log(v + internalState.someNumber);
};
});
}
}
或者还有其他方法吗?以上可能有效(除了缺少依赖注入,我仍然需要了解如何在 Angular 2 中执行此操作)。但是,我想知道这是否是一个好方法,因为我没有遇到任何在其构造函数中进行大量成员初始化的示例。
【问题讨论】:
-
您的问题不是关于如何以角度创建服务,您的问题是“我应该如何管理角度状态?”。有很多选项供您选择。
-
@ChrisG:嗯,也许问题是如何在 Angular 中创建有状态服务(其 API 仍然与其 AngularJS 1 等效,因为我想避免更改我依赖的服务中的代码我也停下来)。
-
你可以在 JS 中做任何你想做的事情。我认为您的问题之所以出现是因为您使用的是 TypeScript,并且它正在强制声明您的属性,这不是您现在处理它的方式。 IMO 最好在您的对象上声明属性(这就是您首先需要 TS 的原因),但是您可以通过转换为 any(不推荐)来绕过 TS 编译器。
-
@ChrisG:哦,我没有使用 TypeScript。我正在使用纯 JavaScript。许多 Angular 2 示例都使用 TypeScript;事实上,太多了,以至于我有时甚至不确定哪些部分是 Angular 2 特有的,哪些是 TypeScript 特有的。
-
如果您使用的是 JS,那么一切都应该按预期工作。您可以在构造函数中利用 DI
标签: javascript angular