2013-11-15 49 views
1

我有一個用例,我想訪問我的BreezeJS EntityManager中的任何實體是否有驗證錯誤。基本上是EntityManager上的「hasValidationErrors」。BreezeJS:檢查是否有實體有驗證錯誤

用例只是簡單地說我想禁用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())。

它也感覺像一個非常「黑客」的做法。

+0

您是否檢查過有關驗證的文檔? http://www.breezejs.com/documentation/validation –

回答

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(); 
    } 
} 

正如你所看到的,我擔心的是,應用程序可能進入的階段快速驗證檢查可能觸發跨多個有待更改的實體進行驗證錯誤檢查的perf殺毒週期。通過提供暫停切換,開發人員可以推遲評估,直到安靜的時間,然後強制執行檢查

我不確定是否需要擔心$scope.$apply()。我很確定這裏涉及的所有內容都是同步的。

+0

這真的是這種不尋常的情況嗎?我可以想象很多情況下,人們可能希望將所有在EntityManager中所做的更改保存爲批處理,並希望公開一個只有在沒有驗證錯誤時才能啓用的「保存更改」按鈕。 無論如何,我發現如果您訂閱EntityManager上的「entityChanged」事件,您實際上可以監聽它是否處於「EntityAction.Detach」操作中,並且如果它是從其中刪除其「getValidationErrors()。length」算我上面描述的。現在我只是擔心每次擊鍵都會調用entityChanged,所以它必須超快。 –

+0

我擔心你可能不得不擔心被調用的頻率。這就是爲什麼我把閂鎖放在那裏;這很可能會被頻繁地調用。 – Ward

+0

這是常見的情況嗎?這是我聽到的第一個。事實上,我會害怕它。假設我看不到的實體無效。作爲一個用戶,我會盯着屏幕,看着一個乾淨的實體的變化,我想知道「爲什麼我不能推保存按鈕?我恨這個應用程序!」禁用該按鈕並不是一個足夠好的UX IMO。您必須讓用戶清楚哪些是錯誤的以及該怎麼做。在我理解這一點之前,我很難對你提出的功能充滿熱情。說服我們:-) – Ward

相關問題