Aurelia是否根据属性的原始值提供任何类型的脏指示器

Aurelia是否根据属性的原始值提供任何类型的脏指示器,aurelia,Aurelia,我有一个编辑表单,我希望在对绑定到输入或选择元素的属性之一进行编辑之前禁用“保存”按钮 但是,如果用户将文本编辑回原始值,则表单不应再被视为脏的 例如: 原始值:“测试”--不脏 用户编辑输入并将值更改为:“测试2”--脏 用户再次编辑输入并将值更改回“Test”--不脏 我看到了一篇描述如何创建dirtyBindingBehavior的帖子,但它只将新值与以前的值进行比较——在这种情况下,上面的第3行仍然会将表单列为Dirty,因为它会将“Test 2”的旧值与“Test”的新值进行比较 关于

我有一个编辑表单,我希望在对绑定到输入或选择元素的属性之一进行编辑之前禁用“保存”按钮

但是,如果用户将文本编辑回原始值,则表单不应再被视为脏的

例如:

  • 原始值:“测试”--不脏
  • 用户编辑输入并将值更改为:“测试2”--脏
  • 用户再次编辑输入并将值更改回“Test”--不脏
  • 我看到了一篇描述如何创建dirtyBindingBehavior的帖子,但它只将新值与以前的值进行比较——在这种情况下,上面的第3行仍然会将表单列为Dirty,因为它会将“Test 2”的旧值与“Test”的新值进行比较


    关于如何实现这一点有什么想法吗?

    您只需复制对象并创建一个getter属性,将旧对象与新对象进行比较(使用
    @computedFrom
    以避免脏检查)。例如:

    import {computedFrom} from 'aurelia-framework';
    
    export class App {
    
      oldModel = new Model();
      newModel = deepClone(this.oldModel);
    
      @computedFrom('newModel.name', 'newModel.surname')
      get hasChanged() {
        return !isEqual(this.oldModel, this.newModel);
      }
    
    }
    
    function deepClone(obj) {
      return JSON.parse(JSON.stringify(obj));;
      //use Object.assign({}, obj) if you don't need a deep clone
    }
    
    function isEqual(obj1, obj2) {
      return JSON.stringify(obj1) === JSON.stringify(obj2);
    }
    
    class Model {
      //something from database;
      name = 'John';
      surname = 'Doe';
    }
    

    运行示例

    如果这解决了您的问题,请将其标记为帮助其他人的答案。在大多数情况下,您只需保留一份序列化副本并进行比较即可。在“deepClone”中仅使用JSON.stringify,并将字符串版本存储在oldModel中。现在再次在newModel上调用JSON.striginfy,通过字符串比较实现“isEqual”。