代码之家  ›  专栏  ›  技术社区  ›  IsraGab

对于“$onInit”和“$onChanges”方法,请保持代码干燥

  •  0
  • IsraGab  · 技术社区  · 7 年前

    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 变量,它特定于我的视图。

    做一个基类?使用装饰器?

    1 回复  |  直到 7 年前
        1
  •  2
  •   lenilsondc    7 年前

    我认为有很多不同的方法可以解决这个问题,但是如果你坚持使用类和继承,你可以提供 _generalProperties 到您的父构造函数并重用整个实现。

    export class BaseSettingsComponent {
        constructor(properties){
            this._properties = properties;
        }
    
        $onInit(){ /* ... implement base component stuff*/ }
    }
    

    然后,在使用相同组件逻辑的每个页面上,您可以扩展基类,向父类提供属性,并让基类完成任务。

    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*/ }
    }
    

    $onInit $onChanges 在孩子的课堂上你必须打电话给 super.$onInit()

    最后,对于更干净的代码,还可以放弃 _一般属性 super 构造器。

    import { BaseSettingsComponent } from '../common/base-settings-component.js';
    
    export class GeneralDeviceSettingsCtrl extends BaseSettingsComponent {
        constructor(){
            super({
                'deviceName': deviceCommands.NAME.key,
                'deviceModel': deviceCommands.MODEL.key
            });
        }
    }