保持我的 `$onInit` 和 `$onChanges` 方法代码干爽
Keep my code DRY for `$onInit` and `$onChanges` methods
我有一段代码几乎在我的所有组件中都重复了:
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
变量,这是我的观点所特有的。
我怎样才能让它保持干爽?
做基地class?使用装饰器?
我认为有很多不同的方法,但如果你坚持使用 classes 和继承,你可以将 _generalProperties
提供给你的父构造函数并重用整个实现。
例如:
export class BaseSettingsComponent {
constructor(properties){
this._properties = properties;
}
$onInit(){ /* ... implement base component stuff*/ }
}
然后,在每个使用相同组件逻辑的页面上,您可以扩展基础 class,向父 class 提供属性,并让基础 class 执行这份工作。
import { BaseSettingsComponent } from '../common/base-settings-component.js';
let _generalProperties = {
'deviceName': deviceCommands.NAME.key,
'deviceModel': deviceCommands.MODEL.key
};
export class GeneralDeviceSettingsCtrl extends BaseSettingsComponent {
constructor(){
super(_generalProperties);
}
$onInit(){ super.$onInit(); /* ... implement base component stuff*/ }
}
使用此方法时要牢记的一件事是,如果您需要在子 classes 上实施 $onInit
或 $onChanges
,则必须调用 super.$onInit()
否则你会因为覆盖而失去父行为。
最后,为了获得更简洁的代码,您还可以丢弃 _generalProperties
的声明,将其直接提供给 super
构造函数。
import { BaseSettingsComponent } from '../common/base-settings-component.js';
export class GeneralDeviceSettingsCtrl extends BaseSettingsComponent {
constructor(){
super({
'deviceName': deviceCommands.NAME.key,
'deviceModel': deviceCommands.MODEL.key
});
}
}
我有一段代码几乎在我的所有组件中都重复了:
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
变量,这是我的观点所特有的。
我怎样才能让它保持干爽? 做基地class?使用装饰器?
我认为有很多不同的方法,但如果你坚持使用 classes 和继承,你可以将 _generalProperties
提供给你的父构造函数并重用整个实现。
例如:
export class BaseSettingsComponent {
constructor(properties){
this._properties = properties;
}
$onInit(){ /* ... implement base component stuff*/ }
}
然后,在每个使用相同组件逻辑的页面上,您可以扩展基础 class,向父 class 提供属性,并让基础 class 执行这份工作。
import { BaseSettingsComponent } from '../common/base-settings-component.js';
let _generalProperties = {
'deviceName': deviceCommands.NAME.key,
'deviceModel': deviceCommands.MODEL.key
};
export class GeneralDeviceSettingsCtrl extends BaseSettingsComponent {
constructor(){
super(_generalProperties);
}
$onInit(){ super.$onInit(); /* ... implement base component stuff*/ }
}
使用此方法时要牢记的一件事是,如果您需要在子 classes 上实施 $onInit
或 $onChanges
,则必须调用 super.$onInit()
否则你会因为覆盖而失去父行为。
最后,为了获得更简洁的代码,您还可以丢弃 _generalProperties
的声明,将其直接提供给 super
构造函数。
import { BaseSettingsComponent } from '../common/base-settings-component.js';
export class GeneralDeviceSettingsCtrl extends BaseSettingsComponent {
constructor(){
super({
'deviceName': deviceCommands.NAME.key,
'deviceModel': deviceCommands.MODEL.key
});
}
}