• [TypeScript] @OnChange for ngOnChanges


    Take away from NGCONF talk.

    It is a good show case to how to use decorator.

    export interface SimpleChange<T> {
      firstChange: boolean;
      previousValue: T;
      currentValue: T;
      isFirstChange: () => boolean;
    }
    
    function OnChange<T = any>(
      callback: (value: T, simpleChange?: SimpleChange<T>) => void
    ) {
      console.log("callback", callback);
    
      const cachedValueKey = Symbol();
      const isFirstChangeKey = Symbol();
    
      return (target, key) => {
    
        Object.defineProperty(target, key, {
          set: function(value) {
            if (this[isFirstChangeKey] === undefined) {
              this[isFirstChangeKey] = true;
            } else {
              this[isFirstChangeKey] = false;
            }
            // No operation if new value is same as old value
            if (!this[isFirstChangeKey] && this[cachedValueKey] === value) {
              return;
            }
    
            console.log("set value", value);
    
            const oldValue = this[cachedValueKey];
            this[cachedValueKey] = value;
            const simpleChange: SimpleChange<T> = {
              firstChange: this[isFirstChangeKey],
              previousValue: oldValue,
              currentValue: this[cachedValueKey],
              isFirstChange: () => this[isFirstChangeKey]
            };
            callback.call(this, this[cachedValueKey], simpleChange);
          },
          get: function() {
            return this[cachedValueKey];
          }
        });
      };
    }
    
    class Person {
      @OnChange<string>(function(newVal, sc) {
        this.trigger(newVal, sc)
      })
      private name: string = "wan";
    
      trigger (newVal, simpleChange) {
        console.log('newVal', newVal);
        console.log('simpleChange', simpleChange);
      }
    }
    
    const p = new Person();
    p.name = "aa"; // first time, trigger changes
    p.name = "aa"; // second time, no trigger
    p.name = "bb"; // Trogger changes

    One take away is that we can use 'symbol' to uqine key.

    const cachedValueKey = Symbol();
    
    this[cachedValueKey]
  • 相关阅读:
    计算机网络中的码元的理解
    屏幕扩展,屏幕相对位置的设置
    wireshark使用入门
    Http下载文件的登录验证
    正则-连续相同的单词
    文件系统和数据库索引用B树而不是红黑树的原因
    红黑树的突破点
    Win 10 Revit 2019 安装过程,亲自踩的一遍坑,有你想要的细节
    Java拦截器的实现原理
    根据进程数,资源数判断是否发生死锁
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10846496.html
Copyright © 2020-2023  润新知