zoukankan      html  css  js  c++  java
  • [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]
  • 相关阅读:
    Bruce Eckel:编程生涯(转载)
    NSScanner用法详解
    如何为github上的项目添加gif效果图
    iOS-网址集
    支持后台播放音频
    iOS:UITableView 方法 属性
    Quartz2D简介及基本线条绘制
    遍历输出所有子视图(View)
    UIView常用属性与方法/UIKit继承结构
    netty02(接受消息以后进行返回)
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10846496.html
Copyright © 2011-2022 走看看