2013-04-17 6 views
3

매우 간단한 레일 & 백본 앱을 만들었습니다. 지금까지 레일 측에서는 검증이 수행되었습니다. 이제 백본 유효성 검사를 구현하는 방법에 대해 생각했습니다. 나는 이렇게하고있다 :Backbone.js 유효성 확인 모델 속성

createCampaign: (e) -> 
    _this= @ 
    e.preventDefault() 
    attributes = 
     info: @getCountries() 
     time_start: @$('#start').val() 
     time_end: @$('#end').val() 
    @collection.create attributes, 
     wait: true 
     success: -> 
     @$('#errors').text('Campaign created!').addClass('correct') 
     @$('#create').removeAttr('disabled'); 
     _this.clearFields('new_campaign') 
     error: -> @handleError 

wait: true와 함께 아무 일도 일어나지 않는다. 만약 내가 그것을 코멘트 성공하면 조치가 취해집니다. 비록 내가 의도에 필요한 데이터를 제공하지는 않는다.
내 모델 & 수집

class SvitlaTest.Models.Campaign extends Backbone.Model 
    initialize: -> 
    @bind("error", @errorHandling) 

    validate: (attrs) -> 
    return "Please fill start time of the campaign." unless attrs.time_start 
    return "Please fill end time of the campaign." unless attrs.time_end 
    "Please fill Countrz & language fields." unless attrs.info 
    errorHandling: (model, event) -> 
    @$('#create').removeAttr('disabled'); 
    @$('#errors').html(error) 

class SvitlaTest.Collections.Campaigns extends Backbone.Collection 
    url: '/api/campaigns' 

    model: SvitlaTest.Models.Campaign 

업데이트 1
내 템플릿 jst.eco

<form method="post" id="new_campaign" class="corners"> 
    <p> 
    <label for="start" >Start time:</label> 
    <input type="text" id="start" name="start" autofocus="" length='30' maxlength='30' /> 
    </p> 
    <p> 
    <label for="end" >End time:</label> 
    <input type="text" id="end" name="end" length='30' maxlength='30' /> 
    </p> 
<div id='country_list'> 
<h4>Info:</h4> 
    <p class="country_element"> 
    Country 
    <input type="text" class='country' id="country" /> 
    Languages 
    <input type="text" class="languages" id="languages" /> 
    </p> 
    </div> 
    <p> 
    <input type="submit" id="create" value="Create" /> 
    </p> 
</form> 

의견의로 : 나는 보석을 사용하고 /백본에 레일 - 1.0 .0.0
입력 한 정보 없음
1) ac tive wait: true 내가 달릴 때
나는 크롬을 사용하고 있습니다. 필드를 비워두면 제출 버튼 (트리거 createCampaign)을 클릭하면 아무것도 표시되지 않습니다.! 성공을위한 콜백이 실행 후 아무것도
정보를 DB에서 생성 또는 wait: true 새로운 모델없이
를 입력

업데이트를 발생하지 : 나는 콘솔 & 네트워크 탭
2) wait: true이 주석을 찾고 있어요

initialize: -> 
    @collection.on('reset', @render,this) 
    @collection.on('add', @appendCampaign ,this) 
    @collection.on("invalid", @handleInvalidState) 
    handleInvalidState: (model, error) -> 
    console.log "validation" 
    console.log model 
    console.log error 

I :
보기의 초기화 첨가 과학 코멘트 아웃 wait: true는 내가이 콘솔 출력을 얻을

validation 
Campaign {cid: "c2", attributes: Object, collection: Campaigns, _changing: false, _previousAttributes: Object…} 
Please fill start time of the campaign. 

내가 아무 일을 주석 처리하지 않는 경우에 당신은 당신이 필요로하는 당신의 백본 모델에 유효성 검사를 구현하기 전에이

+0

같은 상황이 https : // github에서 모두 발생하므로 매우 이상합니다.co.kr/documentcloud/backbone/blob/master/backbone.js # L872를 ​​참조하십시오. 두 경우 모두 어떤 일이 발생하는지에 대해 더 정확하게 설명해 줄 수 있습니까? 유효성 검사가 실패합니까? 서버 호출이 완료 되었습니까? 서버가 아무것도 응답합니까? 또한 백본의 어떤 버전을 사용합니까? – Loamhoof

+0

@Loamhoof 내 장기 결석을 변명. 업데이트 1을 참조하십시오. – Elmor

답변

0

일어나는 이유는 ... 아무 생각이 없다 모델에서 구현 한 유효성 검사 메서드가 어떻게 사용되는지 이해합니다. 백본 유효성 검사를 통해 모델을 잘못된 상태 (불량 데이터 포함)로 만들 수 없습니다. 즉, 유효성 검사를 실패하게하는 모델의 데이터를 설정하려고하면 데이터가 전송되지 않습니다. 이 경우 "유효하지 않은"이벤트가 트리거됩니다.

그래서 처음에는 콜렉션에 "유효하지 않은"이벤트에 대한 콜백을 추가했습니다.

@collection.on "invalid", @handleInvalidState 

handleInvalidState: (model, error) -> 
    // do something with the error. 

실제로 유효성 검사로 인해 요청이 발생하지 않는지 여부는 알 수 있습니다.

소스 코드를 기반으로하면 모델이 컬렉션의 생성 메소드 내에서 유효성을 검사하지 못하면 false를 반환합니다. 그래서 아무 일도 일어나지 않는 것일 수 있습니다.

희망이 도움이됩니다.

+0

고마워, 이제 그걸 시도 할게! – Elmor

+0

업데이트를 참조하십시오. – Elmor

관련 문제