【问题标题】:breeze: Tracking errors with many-to-many associations微风:使用多对多关联跟踪错误
【发布时间】:2014-02-26 21:54:33
【问题描述】:

几周前,我问过如何使用微风保存多对多关联。

Ward Bell 想出了这个不错的解决方案:breeze: many-to-many issues when saving

我已经实施了他的解决方案,效果非常好。不过,我最近提出的一个问题是如何跟踪错误?

以 Ward 为例,我们操作 UserRoleVm 实例。因此该属性不会触发validationErrorsChanged。

如果说父实体的集合中没有至少一个 UserRoleVm 实体,我该如何使用微风来引发错误?

【问题讨论】:

  • 阅读文档,看看我是否能在其中找到解决方案 :) 但没有运气。将 vm 添加到元数据中没有意义,但另一方面,我看不到任何其他让轻率能够验证此属性并引发错误的方法。

标签: breeze


【解决方案1】:

UserRoleVm 是一个常规的 JavaScript 对象。 它不是 Breeze 实体,因此不参与 Breeze 验证支持。没有明显的方法可以做到这一点(至少对我来说不明显)。几乎我能想到的任何东西都比编写传统的、基于视图的验证更复杂。

您需要什么样的验证?在我放在一起的示例中,用户只能添加和删除角色(相当于超能力)。用户无法触摸相应映射实体的任何值(甚至可能还不存在)。

当我放开我的想象力时,我会推测关于用户可以拥有多少角色的规则,或者是否允许某些规则组合......或不允许。是这个意思吗?

如果我有这样的规则,我会在外部 ViewVM(而不是 UserRoleVMs)中构建验证逻辑......监督用户操作的 VM。此逻辑与您在元数据中注册的 Breeze 验证逻辑完全不同……Breeze 在每个实体的EntityAspect 中实施的验证规则。

最终,我也有 Breeze 验证...可能在父 User 实体类型上进行实体验证...这样我就可以防止实际尝试保存无效的 @987654325 @组合。

但是这样的 Breeze 验证规则不会生效直到您尝试保存。当用户使用“item VMs”(UserRoleVms)时,验证规则将由 ViewVM 用老式的原生 JavaScript 单独定义和实现。

这就是我此刻的想法。

【讨论】:

  • 我需要的验证是应用程序用户不应该能够在不分配至少一个角色的情况下保存新用户。换句话说,在多对多关联中必须至少有一个 UserRole 项。如果用户尝试保存,则应该有一个验证错误,并且 UserRole 用户控件旁边会显示一个 *。我知道 VM 对象不是 Breeze 实体,但由于我已经围绕 Breeze 的 validationErrorsChanged 属性实现了所有验证机制,所以我希望有一种方法可以做这种事情。我认为我们需要 Breeze 来支持 m-2-m :)
  • 您可以为用户实体编写这样的验证规则,并在保存中包含修改后的用户。然后保存逻辑将在保存到服务器之前拦截它,您可以将其反映回 UI。我仍然认为我会在 View 上收到警告,表明需要至少一个角色。您可以禁用保存,直到他们至少有一个。
  • 顺便说一句,当改变像UserRoles这样的依赖成员时,强制一个mod到User)是处理并发的好技术;我喜欢在“聚合根”上这样做,而不是在成员实体级别进行检查。但我离题了。至于“m-2-m”,你并不孤单。我个人讨厌它,但我们可能还是会这样做。
  • 病房,看我下面的回复。
【解决方案2】:

按照沃德的建议,我有:

-添加了以下代码,用于在添加或删除 UserRoleVM 时强制修改用户实体的状态:

  $scope.user.entityAspect.setModified();

-添加了一个自定义验证器,用于验证 User 实体上的 UserRoles 集合:

function notEmptyCollectionValidator() {
        var name = "notEmptyCollectionValidator";

        var validator = new breeze.Validator(name, function (value) {
            if (!value || value.length === 0) {
                return false;
            } else {
                return true;
            }
        });

        return validator;
    }

 breeze.Validator.registerFactory(notEmptyCollectionValidator, 'notEmptyCollectionValidator');


 var entityType = metadataStore.getEntityType('User');
 entityType.getProperty('userRoles').validators.push(breeze.config.functionRegistry['Validator.notEmptyCollectionValidator']());

现在,当我点击保存按钮时,验证发生在 userRoles 集合上。如果没有选择 userRole,我会收到验证错误,并在 UI 中的控件旁边显示一个 *。

显然,这不适用于 OnChange 验证。我还不知道我将如何实现这一目标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2018-06-14
    相关资源
    最近更新 更多