我想在typescript中跟踪对类属性的更改,以便我只更新数据库中实际已更改的字段。目前,我正在使用一个数组,我在更改时添加属性,然后遍历数组以确定哪些字段已更改并需要在数据库中更新。但是,我更喜欢用某种isDirty检查来做这件事。我的想法是,我可以调用类似if (property.dirty) then {}
的内容来确定属性是否已更改。
我记得能够在vb.net中沿着这些方向做一些事情,但已经有一段时间了,我不记得我们在该代码库中做了什么。
以下所需的代码是否可行?
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;
}
}
}
答案 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中的属性。
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