【问题标题】:Aurelia - Custom validation to check if a form has changesAurelia - 自定义验证以检查表单是否有更改
【发布时间】:2018-01-26 11:21:17
【问题描述】:

我看到 THIS 关于我正在验证的表单是否已更改的问题。

但是它与 Aurelia 验证无关,我想在单击保存按钮时验证表单是否有任何更改。我不想在服务器上做。

我所做的是保存我最初获取的值,以便进行比较。

        fetch("/api/Client/editClient/" + parms.id, {
            method: "GET",
            headers
        })
            .then(response => response.json())
            .then(data => {
                this.client.deserialize(data);
                this.originalClient === this.client;
            })

原始客户端是未修改的对象。

我创建了一个自定义验证函数,但它没有按预期工作。

我想我可以使用当前值,然后将其与原始值进行比较。

    ValidationRules.customRule(
        'changesExist',
        (value, obj, fetchedEntity) =>
            fetchedEntity != value,
        'No changes detected'
    );

当我尝试使用它时,我发现它出错了:

    // Validation Rules.
    ValidationRules
        .ensure(a: ClientDetails) => a).satisfiesRule('changesExist', this.originalClient);

我不确定如何完成这项工作。我想要的是一个将 orginalClient 对象与要发送回服务器的对象进行比较的验证。这样我可以检查是否有理由将其发送回可以将其保存到数据库中...

【问题讨论】:

  • this.client.deserialize(data); 是做什么的?另外你为什么这样做:this.originalClient === this.client;?总之,fetchedEntity != value 这一行做了一个对象引用比较
  • 关于反序列化,我的印象是我需要这样做才能将其应用于表单。它在激活功能中。我想比较这两个对象。因此这是错误的。我需要获取数据的副本,以便最后比较两者。
  • 没错,这就是我想向您指出的。

标签: aurelia


【解决方案1】:

这是相当蛮力的,但这很可能会做你想做的事:

 JSON.stringify(fetchedEntity) !== JSON.stringify(value)

【讨论】:

    【解决方案2】:

    app-contacts 示例应用程序使用areEqual 函数来实现。查看 repo,您​​可以了解它的使用方式以及如何根据您的目的对其进行调整。

    function areEqual(obj1, obj2) {
        return Object.keys(obj1).every((key) => obj2.hasOwnProperty(key) && (obj1[key] === obj2[key]));
    };
    

    【讨论】:

      猜你喜欢
      • 2011-08-09
      • 1970-01-01
      • 2017-09-30
      • 2017-08-27
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多