2012-03-29 2 views
3

나는이 모델의 속성 중 하나의 형식을 검증하는 사용자 정의 유효성 검증 방법과 백본 모델을 가지고하지 않을 경우 실행 검증 및 설정에 불 오류 이벤트하지만이 설정 것을 중지하지 않습니다. 내 모델은 텍스트 필드를 통해 상기 속성을 노출하는 뷰에 연결됩니다. 뷰에는 모델 변경 사항을 다시 서버에 저장하기 위해 사용자가 명시 적으로 눌러야하는 '저장'버튼이 있습니다. Backbone.js : 검증이

잘못된 속성 값, I는 할 사용자 유형은 시각적으로 무효 상태 인 것으로 필드를 표시 할 때. 지금까지, 쉬운 - 나는 myModel.set({ attribute: value })를 호출하는 함수에 입력 필드의 변경 이벤트를 바인딩과 유효성 검사가 실패하고 난 무효로 입력을 표시해야 할 때 말할 모델에 "error" 이벤트를 수신 할 수 있습니다. 내가 저장 버튼을 클릭을 처리 할 때

문제

온다. Backbone.Model.set은 유효성 검사가 실패 할 경우 실제 모델의 속성 설정을 중단하기 때문에 값이 유효하지 않으면 내 모델에 사용자가 입력 한 값이 정확하게 반영되지 않습니다. 사용자가 잘못된 값을 입력 한 후 저장을 클릭하면 모델 유효 여부를 확인하고 유효하지 않은 특성이 실제로 설정되지 않았기 때문에 모델이 유효한지 확인한 다음 이전 (유효한) 특성 값을 서버에 저장합니다. 내가 원하는 것 같아 무엇

는 항상 요청한 변경합니다 set의 버전입니다,하지만 여전히 검증 및 이벤트를 트리거합니다. set(..., { silent: true })은 변경을 허용하지만 유효성 검사 또는 이벤트 트리거를 실행하지 않습니다.

간단히 말해서 - 내 모델이 유효하지 않은 상태 (사용자가 유효하지 않은 속성 값을 입력 한 경우)에 존재하기를 원하며 유효 기간과 무효 기간 사이에 전환 할 때 이벤트를 가져오고 싶습니다. 백본과 함께이 작업을 수행하는 적절한 방법이 있습니까? 아니면 완전히 잘못 생각하고 있습니까? 나는 검증 이런 종류의와 함께했던 어떤

답변

2

전에 저장

이 방법을 (세트 만 실패하지 않는 경우가 저장하고있는)을 클릭 저장에 저장 입력에서 속성 모델을 재설정하는 것입니다 버튼을 클릭하면 유효성 검사가 트리거되어 오류가 트리거됩니다.

이것은 모델이 항상 유효하고 입력이 모두 유효 할 때까지 다음 페이지로 진행할 수 없다는 것을 의미합니다.

+0

네,이 방법이 효과가 있습니다. 차라리 실제 입력 값을 다시 가져올 필요는 없겠지만, 모델이 유효하지 않은 상태 인 경우에는 set을 호출하여 전체 현재 특성 해시를 전달하고 성공할 경우에만 저장할 수 있다고 가정합니다. . jashkenas가 대체 접근법을 제안한 백본 (backbone) 문제를 열었습니다. https : // github.co.kr/documentcloud/backbone/issues/1169 – grumbler

5

이 백본 유효성 검사 플러그인을 사용하는 것이 좋습니다. https://github.com/thedersen/backbone.validation 매우 유용합니다. 유익한 경우 (값이 유효하지 않은 경우에도 값을 설정할 수 있음) 모델의 설정 기능을 무시하면됩니다.

set: function (key, value, options) { 
     options || (options = {}); 
     options = _.extend(options, { forceUpdate: true }); 
     return Backbone.Model.prototype.set.call(this, key, value, options); 
    } 

backbone.validation의 'forceUpdate'속성을 사용하면 유효성 검사를 계속 호출하면서 validate 메소드가 true를 반환 할 수 있습니다. 후 저장

 var errors = model.validate(model.validate.attributes); 

이 당신의 모델이 모든 오류를 반환하고 당신이 적절하게 표시 할 수 있습니다, 당신이 호출 할 수 있습니다, 클릭하십시오. 유효하고 유효하지 않은 콜백도 있습니다. 자유롭게 사용할 수 있습니다.

+0

그래, 기본 모델 세트 (나는이 플러그인이 그렇게한다고 가정한다.)의 이런 종류의 오버라이드를 생각해 보았다. model.set (key, value, {forceUpdate : true})를 호출하면 모델을 무시하고 인스턴스를 사용하기 때문에 모델 수준에서 강제로 사용하게됩니다. – PJUK

+0

네, 맞습니다. 재정의는 설정 한 모든 위치에서 {forceUpdate : true} 인수를 쓰는 것을 피하기 위해 수행됩니다. 당신이 말하는 것처럼, 사용 사례에 달려 있습니다. – Krunal