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

时间:2013-11-15 15:19:36

标签: breeze

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

用例只是我想在UI上禁用“保存更改”按钮,因为我使用的是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())。

这也感觉像是一种非常“hackish”的方式。

1 个答案:

答案 0 :(得分:0)

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

分离实体确实会清除验证错误。你确认它没有引发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()。我很确定这里涉及的所有内容都是同步的。