2012-12-21 2 views
2

Breeze를 사용하여 SaveChanges를 사용하여 저장하는 경우 필수 필드가있는 경우 간단한 업데이트를 수행 할 때 오류가 발생합니다.Breeze : 저장시 유효성 검사 오류

예를 들어

내가 이메일 필드가 필요하지 않은 이름을 가진 사용자의 테이블 및 이메일 필드가 있습니다.

나는 사용자 이름의 목록을 표시 할 수 있습니다 (하지만 이메일을 표시하지 않음)

디스플레이 작동하지만라는 결코 극복을 막아

- 나는

인해 저장하지

자바 스크립트 유효성 검사 오류 유효성 검사 오류 : '전자 메일'이 필요합니다.

그러나이 필드는 변경된 입력란에 간단한 업데이트를 생성해야하며 전자 메일로는 아무것도 수행하지 않아야합니다. 난 그냥 목록에

어떤 아이디어

HTML이

<a href="#" data-bind="click: save">Save</a> 
<ul data-bind="foreach: modules"> 
<li > 
    <form> 
     <input type="checkbox" data-bind="checked: IsRunning" /> 
     <input type="text" data-bind="value: ModuleName, css: { done: IsRunning }" /> 
    </form> 
    </li> 
</ul> 

같은 외모와는 부분이 저장 뷰 모델을 1 항목을 변경하면

이상하게도 나는 오류가 발생하지 않습니다

function saveChanges() { 
    if (manager.hasChanges()) { 
     manager.saveChanges() 
      .then(saveSucceeded) 
      .fail(saveFailed); 
    } else { 
     logger.info("Nothing to save"); 
    }; 
} 
function saveSucceeded(saveResult) { 
    logger.success("# of Modules saved = " + saveResult.entities.length); 
    logger.log(saveResult); 
} 

function saveFailed(error) { 
    var reason = error.message; 
    var detail = error.detail; 

    if (reason === "Validation error") { 
     handleSaveValidationError(error); 
     return; 
    } 
    if (detail && detail.ExceptionType.indexOf('OptimisticConcurrencyException') !== -1) { 
     // Concurrency error 
     reason = 
      "Another user, perhaps the server, may have deleted one or all of the todos."; 
     manager.rejectChanges(); // DEMO ONLY: discard all pending changes 
    } 

    logger.error(error, 
     "Failed to save changes. " + reason + 
     " You may have to restart the app."); 
}; 
function handleSaveValidationError(error) { 
    var message = "Not saved due to validation error"; 
    try { // fish out the first error 
     var firstErr = error.entitiesWithErrors[0].entityAspect.getValidationErrors()[0]; 
     message += ": " + firstErr.errorMessage; 
    } catch (e) { /* eat it for now */ } 
    logger.error(message); 
} 

아래 마이크

,

답변

1

흠 ... 전자 메일은 필요하지 않지만 메타 데이터는 그것이 있다고 생각합니다. 이 속성의 메타 데이터를보고이를 확인할 수 있습니까? 코드는 다음과 같습니다.

var userType = myEntityManager.metadataStore.getEntityType("User"); 
var emailProp = userType.getProperty("email"); 
var isRequired = !emailProp.isNullable; 

메타 데이터가 필드가 필요하다고 생각되면 서버에 설정되었을 가능성이 큽니다. 따라서 EF 모델을 살펴보고 [Required] 속성이이 속성에 추가되지 않았는지 확인하십시오. 또한이 필드가 데이터베이스인지 아닌지 확인하십시오.

어떤 만 수정 된 필드가 실제로 얻을 것이다, 비록 감동되지 않은, 심지어 필드를 저장하기 전에 서버에 전체 실체를 확인하려고합니다 기본 바람에 의해,주의해야 할 또 다른 항목 업데이트되었습니다. 이는 의도적으로 설계된 동작입니다.

그러나, 당신과 같이 EntityManager를의 'validationOptions'을 설정하여이 동작을 억제 할 수 있습니다 : 답장을

var vo = new breeze.ValidationOptions({ 
    validateOnSave: false, 
    validateOnQuery: false, // not needed here but shown for completeness 
    validateOnAttach: true // not needed here but shown for completeness 
}); 
myEntityManager.setProperties({ validationOptions: vo }); 
+0

감사합니다. 미안 해요. 제 질문은 확실하지 않았습니다. 이메일은 DB에 필요하지만 애플리케이션에 표시되거나 사용되지 않습니다. 이제 유효성 검사가 진행되는 중이므로 유효성 검사를 해제하여 (현재는) 해결했습니다. 그러나 이상한 점은 이메일 필드에 값이 있다는 것입니다.하지만 사용자에게 표시되지 않으므로 유효성 검사 오류가 발생해야합니까? – Mike

+0

breeze는 UI에서 렌더링하는 것을 실제로 알지 못합니다. 모델에 대해서만 알고 있습니다. 속성이 메타 데이터에 있고 필수 속성 인 경우 기본적으로 유효성이 검사됩니다. 아이디어는 db에 있다고해서 그것이 유효 함을 의미하지는 않습니다. 그러나 속성이 필요하지 않은 경우 속성을 모델에서 제외 할 수 있습니다. 이게 말이 돼? –

+0

귀하의 의견을 다시 한 번 말씀 드리지만, 실제로 유효성 검사가 잘못되었다거나, 데이터가 포함되어 있어도 필요한 유효성 검사 오류가보고되거나 유효성 검사에서 다른 오류가보고되고 있습니까? –