【发布时间】:2019-01-26 23:34:48
【问题描述】:
我的几乎所有组件中都重复了一段代码:
import {deviceCommands} from "../../../core/data/Commands";
let _generalProperties = {
'deviceName': deviceCommands.NAME.key,
'deviceModel': deviceCommands.MODEL.key
};
export default class GeneralDeviceSettingsCtrl {
constructor($scope) {
let $ctrl = this;
$ctrl.$onChanges = function (changes) {
for(let prop in _generalProperties) {
$ctrl[prop] = $ctrl.test.vm.data[_generalProperties[prop]];
}
};
$ctrl.$onInit = function () {
for(let prop in _generalProperties) {
$scope.$watch(() => $ctrl.test.vm.data[_generalProperties[prop]],
(newValue, oldValue) => {
if (newValue !== oldValue) {
$ctrl[prop] = $ctrl.test.vm.data[_generalProperties[prop]];
}
});
}
};
}
}
唯一不同的是_generalProperties 变量,这是我的观点所特有的。
如何保持干燥? 做一个基类?使用装饰器?
【问题讨论】:
-
扩展基类是一个简单而明显的模式。在我自己的许多项目中,某些类别的组件最终都是以这种方式处理的。
-
为什么在构造函数中给对象附加方法,而不是在类中定义方法?
-
您是在询问 _generalProperties 吗?没有特别的原因,我希望我的课程尽可能短,并将内容保留给用户与视图的交互
-
不,我的意思是你在构造函数中做
$ctrl.$onInit = ...。您可以在构造函数之外和在类中定义类的方法。 -
并非如此,在构造函数之外定义它们似乎更简洁。另外,这些方法在原型上进行并且只创建一次,但我假设您不会多次创建此控制器。
标签: javascript angularjs ecmascript-6 dry angularjs-components