使用isDirty扩展属性

时间:2017-07-24 13:32:49

标签: javascript typescript properties

我想在中跟踪对类属性的更改,以便我只更新数据库中实际已更改的字段。目前,我正在使用一个数组,我在更改时添加属性,然后遍历数组以确定哪些字段已更改并需要在数据库中更新。但是,我更喜欢用某种isDirty检查来做这件事。我的想法是,我可以调用类似if (property.dirty) then {}的内容来确定属性是否已更改。

我记得能够在中沿着这些方向做一些事情,但已经有一段时间了,我不记得我们在该代码库中做了什么。

以下所需的代码是否可行?

当前代码

class test{
  private _ID: Guid;
  private _dirty: Array<{}>;

  get ID(): Guid {
    return this._ID;
  }
  set ID(id: Guid) {
    if (this._ID != id) {
        this._ID = id;
        this._dirty.filter(function (f) { return f.Field == "id" }).length > 0 ? this._dirty.filter(function (f) { return f.Field == "id" })[0].Value = id.toString() : this._dirty.push({Field: "id", Value: id});
    }
  }

  get Name(): string {
      return this._Name;
  }
  set Name(name: string) {
      if (this._Name != name) {
          this._Name = name;
          this._DirtyFields.filter(function (f) { return f.Field == "ccseq_name" }).length > 0 ? this._DirtyFields.filter(function (f) { return f.Field == "ccseq_name" })[0].Value = name : this._DirtyFields.push(new EntityField("ccseq_name", name, FieldType.String));
      }
  }
}

期望代码

class test{
  private _ID: Guid;

  get ID(): Guid {
    return this._ID;
  }
  set ID(id: Guid) {
    if (this._ID != id) {
        this._ID = id;
        this._ID.isDirty = true;
    }
  }

  get Name(): string {
      return this._Name;
  }
  set Name(name: string) {
      if (this._Name != name) {
          this._Name = name;
          this._Name.isDirty = true;
      }
  }
}

2 个答案:

答案 0 :(得分:0)

在javascript中,您可以向对象添加属性,因此执行此操作不是问题:

this._ID.dirty = true;

即使Guid没有此dirty成员 问题当然是打字稿会因此而抱怨 为了避免这种情况,你可以简单地做:

private _ID: Guid & { dirty?: boolean };

修改

同样,javascript已经支持它,你可以这样做:

obj.dirty = true;

对于任何js类型:布尔值,字符串,数组甚至函数 但是为了在打字稿中得到支持,你可以这样做:

interface Object {
    dirty?: boolean;
}

但请注意,您要将此内容添加到代码中包含的所有对象中。由于你实际上没有改变原型,它在运行时不会有任何影响,但是打字原则它会影响所有实例。

答案 1 :(得分:0)

我解决这个问题的方法是创建一个Field类,然后将其用作Objects中的属性。

Field Class

export class EntityField {
    private _Field: string;
    private _Value: any;
    private _FType: FieldType;
    private _isDirty: boolean;

    constructor(field: string, value: any, fType: FieldType) {
        this._Field = field;
        this._Value = value;
        this._FType = fType;
        this._isDirty = false;
    }

    markClean(): void {
        this._isDirty = false;
    }

    markDirty(): void {
        this._isDirty = true;
    }

    get isDirty(): boolean {
        return this._isDirty;
    }

    get Field(): string {
        return this._Field;
    }
    set Field(field) {
        if (this._Field !== field) {
            this._Field = field;
        }
    }

    get Value(): any {
        return this._Value;
    }
    set Value(value: any) {
        if (this._Value !== value) {
            this._Value = value;
            this._isDirty = true;
        }
    }

    get FType(): FieldType {
        return this._FType;
    }
    set FType(fType: FieldType) {
        if (this._FType != fType) {
            this._FType = fType;
        }
    }
}

用法

export class Entity{
  public Name: Field
}

Entity test = new Entity()
Entity.Name.isDirty() // Returns False
Entity.Name.Value = "Test";
Entity.Name.isDirty() // Returns True