BreezeJS:检查是否有任何实体存在验证错误

BreezeJS:检查是否有任何实体存在验证错误,breeze,Breeze,我有一个用例,我想访问BreezeJS EntityManager中的任何实体是否存在验证错误。基本上是EntityManager上的hasValidationErrors 用例就是我想禁用UI上的SaveChanges按钮,因为我使用的是Angular Binding系统,所以它应该是一个快速的操作 对我来说,这似乎是不存在的,我想知道是否有任何简单的解决办法或任何实际的方式来实现它 我最接近的例子如下: var mgr = new breeze.EntityManager(

我有一个用例,我想访问BreezeJS EntityManager中的任何实体是否存在验证错误。基本上是EntityManager上的hasValidationErrors

用例就是我想禁用UI上的SaveChanges按钮,因为我使用的是Angular Binding系统,所以它应该是一个快速的操作

对我来说,这似乎是不存在的,我想知道是否有任何简单的解决办法或任何实际的方式来实现它

我最接近的例子如下:

    var mgr = new breeze.EntityManager(
        {
            serviceName: "/breeze/Model/"
        });

    var errorCount = 0;
    mgr.validationErrorsChanged.subscribe(function (validationChangeArgs) {

        var added = validationChangeArgs.added;
        if (added) {
            errorCount += added.length;
        }

        var removed = validationChangeArgs.removed;
        if (removed) {
            errorCount -= removed.length;
        }
    });
然后使用errorCount查看是否存在任何验证错误。但这种方法没有考虑当实体存在验证错误时是否分离实体。例如,通过调用EntityManager上的rejectChanges


这也感觉像是一种非常老练的方法。

我不相信有一种快速的方法可以做到这一点。这是一个如此罕见的案例,我相当怀疑我们是否会为此实现特殊的逻辑

分离实体不会清除验证错误。您是否确认它不会引发EM.validationErrorsChanged事件?糟糕透了

无论如何,你的方法确实有点脆弱

短路测试的一种方法是首先检查EM是否有变化。如果没有,检查验证错误就没有意义了,因为您只能保存更改的实体无效未更改的实体无关紧要

下面是一些适用于datacontext的代码,这些代码可能对您有用,但没有经过尝试或测试,但它们的想法是:

datacontext.enableSave = em.hasChanges();      // should bind to datacontext.enableSave
datacontext.checkEnableSave = checkEnableSave; // can call at will
datacontext.suspendEnableSaveChecking = false  // as explained

// potentially reset flag when hasChanges changes
// or when validationErrorsChanged
em.hasChangesChanged.subscribe(checkEnableSave);
em.hasValidationErrorsChanged.subscribe(latchedCheckEnableSave );

function checkEnableSave () {

    datacontext.enableSave = em.hasChanges();
    if (!datacontext.enableSave) return; // no changes -> disable save

    // changes pending; only enable if no validation errors
    var changes = em.getChanges();
    for (var i = changes.length; i--;) {
        if (changes[i].entityAspect.hasValidationErrors) {
            datacontext.enableSave = false; // so sad
            return; // look no further;  we're done.
        }
    }        
}

// can disable validation error checking when you know
// that there will a flurry of validation changes
function latchedCheckEnableSave () {
    if (!dataContext.suspendEnableSaveChecking) {
        setEnableSave();
    }
}
如您所见,我担心该应用程序可能会进入快速验证检查阶段,这可能会触发跨多个具有待定更改的实体的验证错误检查的性能终止周期。通过提供挂起切换,开发人员可以将评估推迟到安静时间,然后强制检查


我不确定您是否需要担心$scope.$apply。我很确定这里涉及的所有内容都是同步的。

您检查过关于验证的文档了吗?这真的是一个不寻常的案例吗?我可以想象在许多情况下,人们可能希望将EntityManager中所做的所有更改作为一个批保存,并希望公开一个只有在没有验证错误时才应启用的保存更改按钮。无论如何,我发现如果您订阅EntityManager上的entityChanged事件,您实际上可以侦听它是否在操作EntityAction.Detach上,如果是,则从我上面描述的计数中删除其getValidationErrors.length。现在我只是担心entityChanged在每次击键时都会被调用,所以它一定是超快的。我担心您可能需要担心调用的频率。这就是为什么我把门闩放在那里;这完全有可能被调用得太频繁。这是一种常见的情况吗?这是我第一次听说它。事实上,我会害怕的。假设我看不到的实体无效。作为一个用户,我会盯着屏幕,看着一个干净的实体和变化,我想知道为什么我不能按下保存按钮?我讨厌这个应用程序!在我看来,禁用按钮还不够好。你必须让用户清楚地知道什么是错的,该怎么做。在我更好地理解这一点之前,我很难对您提出的功能产生热情。说服我们:-这个问题可能源于我懒惰的天性。我有几个不同的控制器,它们都显示不同实体的集合,可以编辑。在这些视图中,我使用zValidate指令显示错误消息,因此用户会收到验证错误的警告。但是,我不想因为必须编写代码来检查所有这些不同实体在每个控制器中是否有效而产生开销,我更希望能够简单地询问EntityManager上当前是否存在任何错误。另一种选择是订阅控制器中每个实体上的HasValidationErrorChanged。