2014-09-25 3 views
1

사용자가 많은 중첩 된 질문을 추가 할 수있는 폼을 만들고 각 질문에 많은 중첩 된 대답이있을 수 있으며 다른 필드에는 ActiveRecord 유효성 검사기가 있으며 실패하면 페이지가 다시로드되고 삽입 된 필드는 여전히 거기에. (예 : cocoon:before-insert 등)폼 재로드 후의 고치 콜백

모든 콜백은 삽입 된 객체에 예를 들어, 드롭 다운의 변화 핸들러를 다시로드되지 않습니다

페이지가 서버 -에 다시로드하면 나는이 콜백 존중하기 위해 할 수있는 일 사이드 밸리데이터가 실패합니까?

또 다른 점은 컨트롤러의 new 메서드가 호출 될 때 빌드 된 중첩 된 객체에 고치 콜백 내부에 만들어진 처리기를 추가하는 가장 좋은 방법은 코드 품질입니다 (예 : after -insert/before-insert 콜백)?

$(document).ready -> 
    $('#questions').on("cocoon:after-insert", (e, added_question) -> 
    added_question.find('#type').change -> 
     if $(this).val() is "1" 
     added_question.find("#answers").hide() 
     else 
     added_question.find("#answers").show() 

편집 : 여기

는 설명을위한 몇 가지 예제 커피 스크립트 코드의 제거 문제는 적절한 래퍼 클래스의 부족 때부터 질문을 변경

편집 # 2 : 추가 샘플 코드

+0

어떻게 콜백 처리를 정의합니까? 문서 준비 이벤트에서? 몇 가지 코드를 보여줄 수 있습니까? 레일 4를 사용하고 있습니까? – nathanvda

+0

예, 문서 준비 이벤트에서 몇 가지 설명을 위해 코드를 추가했습니다. div #type의 변경 핸들러가 더 이상 객체에 바인딩되지 않고 레일즈 4.0.1을 사용합니다. –

답변

1

rails4를 사용할 때 turbolinks을 사용 중이므로 document.ready 이벤트를 더 이상 사용할 수 없으며 page:change 이벤트를 수신해야합니다.

그래서 코드가 될 것이다 :

$(window).bind 'page:change',() -> 
    $('#questions').on("cocoon:after-insert", (e, added_question) -> 
    added_question.find('#type').change -> 
     if $(this).val() is "1" 
     added_question.find("#answers").hide() 
     else 
     added_question.find("#answers").show() 

는 다른 방법이 이럴 동일 $(document).on 'page:change',() -> ...을 작성할 수 있습니다.

[UPDATE : 대체 솔루션] : 당신이 before-insert과 시도해야 할 수도 있습니다

  • 정말 이벤트 핸들러 : 몇 가지 발언을 읽을 수 있었다. 그럴 수도 있습니다.

  • 두 번째로 ID#type을 사용하고 있지만 페이지가 두 개 이상 있습니까? 그것은 문제를 요구하고 있습니다 :) 당신이 하나 이상을 얻고 있다면, 클래스를 사용하십시오. 또한 더 구체적인 이름을 사용하십시오.

간단한 해결책이있다 : JQuery와 동적 바인딩 할 수 있습니다, 그래서 당신은 쓸 수

$('#questions').on 'change', '.question-type',() -> 
    var this = $(this) 
    var question = $(this).parent('.your-question-class') 
    question.toggle() 

당신이 정말로 값을 확인해야하는 경우 확실하지, 단지 가시성을 전환?

이 코드는 테스트되지 않았지만이 코드는 gis를 얻길 바랍니다. jquery on 핸들러를 살펴보면 선택기로 이벤트를 잡을 수 있습니다. 이 경우 question-type (잘못된 #type ID 대신) 클래스의 요소에있는 #questions div 내부의 변경 이벤트가이 핸들러에서 처리됩니다. 동적 요소는 컨테이너 요소에 연결되어 있기 때문에 동적입니다. 따라서 질문을 추가하거나 제거하더라도 여전히 유효합니다.

+0

실제로 제가있었습니다. 터보 링크를 사용하지 않고 이것을 시도하는 스위치를 만들었지 만 $ (window) .bind가 작동하지만 변경 핸들러는 기존 객체에는 적용되지 않습니다. 예 : 고치를 통해 Q1을 삽입하고 #type div를 변경합니다. 변경 콜백을 일으킨 다음 오류가있는 양식을 제출하고 페이지가 변경되지만 Q1 객체가 삽입되지 않고 유지 관리되므로 삽입 후 콜백이 여전히 존재하고 새 객체에 대해 작동하지만 실행되지 않습니다. 페이지를 변경하기 전에 생성 된 객체에 대해 –

+0

몇 가지 발언을 추가했습니다. – nathanvda

+0

부모 메서드는 내가 필요로하는 것입니다. 감사합니다. 토글에 관해서는,이 코드는 실제 코드에 약간의 샘플 코드가 있기 때문에 샘플 코드였습니다.하지만 좀 더 살펴 보겠습니다. 감사합니다! –