2011-03-20 3 views
2

내 자바 스크립트가 긁히지 않았으며 제공된 함수를 재정의하려고 고심하고 있습니다.제공된 rails.js를 수정하지 않고 Rails 3의 눈에 잘 띄지 않는 JavaScript 기능을 어떻게 무시할 수 있습니까?

바닐라 자바 ​​스크립트 confirm() 대신 jQuery UI 모달 대화 상자를 사용하여 a[data-confirm]을 처리하는 방식을 수정하고 싶습니다.

rails.js의 해당 기능은 allowAction(element)입니다. 이 파일을 다른 파일에 정의하면 firebug 콘솔에서 성공적으로 호출 할 수 있지만 버전은 여전히 ​​data-confirm 속성이있는 앵커에서 호출됩니다.

(function($) { 
... 
})(jQuery); 

공급 rails.js을 수정없이이 기능을 를 오버라이드 (override) 할 수있는 합리적인 방법이 있나요 : 전체 rails.js 파일에 싸여 있기 때문에

이 나는 ​​것 같아요?

편집 :

allowAction-rails.js의 호출이 .live 전화에 싸여 :

$('a[data-confirm], a[data-method], a[data-remote]').live('click.rails', function(e) { 
    var link = $(this); 
    if (!allowAction(link)) return false; 

    if (link.attr('data-remote')) { 
    handleRemote(link); 
    return false; 
    } else if (link.attr('data-method')) { 
    handleMethod(link); 
    return false; 
    } 
}); 

가 나는 또한 아무 소용, 이전과 rails.js 후 내 자바 스크립트를 포함했습니다.

편집 :

내가 .die('click.rails')를 호출한다면, 그때 전체 click.rails 이벤트를 다시 정의 할 수 있지만, 원래 handleRemote()handleMethod() 함수가 호출되지 않습니다.

답변

7

FYI, 나는 레일즈 jquery-ujs에 외부 API를 추가했다. 이제 rails.js가 $.rails.allowAction 기능을 연결하고 다시 한 줄 쓰기하여 맞춤 확인 방법을 사용할 수있게되었습니다.

예제에 대한 자세한 설명은 내 기사 Rails jQuery UJS: Now Interactive을 참조하십시오.

편집 : 이제 this commit부터 confirm 대화 상자 기능을 동일한 방식으로 재정의 할 수 있습니다. 예 :

$.rails.confirm = function(message) { return myConfirmDialog(message); }; 
+0

해커 뉴스에서 이것을 보았습니다. – nfm

+0

더 나은 점은, 이제'confirm' 대화 상자를'$ .rails' 객체로 옮겼습니다. 그래서 다른 확인 대화 상자를 사용하는 것이 더 쉽습니다. 업데이트 된 답변보기 – jangosteve

+0

확인을 트리거 한 요소에 액세스하여 어떻게 대화 상자를 사용자 정의 할 수 있는지 궁금합니다. –

1

이와 비슷한?

//Backup our original function just in case 
var backupFunc = allowAction; 

//Your replacement function 
var myFunc = function(element){ 
    //Have it your way, badabababa :) 
}; 

//Override default 'allowAction' function 

allowAction = myFunc; 

/* 
    Restore it the way it was before: allowAction = backupFunc; 
*/ 

EDIT : 기능에 범위 닫힌 범위에있다. 그래서 당신은 당신이 원하는대로 행동 할 수 없습니다.

+0

행운을 빌어, 내가 시도한 것과 동일하게 작동합니다. 추가 정보로 업데이트 된 질문 – nfm

+0

click.rails 이벤트를 재정의하는 경우 handleRemote() 및 handleMethod() *가 호출되도록 원본과 동일하게 만들 수 없습니까? – mattsven

+0

그게 내가 한 일이다.'.live' 익명 함수 전체를 복사하여 붙여 넣고,'allowAction' 호출을'myAllowAction'으로 바꿨습니다. 'handleRemote'와'handleMethod' 함수는 복사 된 코드에서 호출하려고 할 때 정의되지 않았습니다. – nfm

0

방금 ​​rails.js 코드 (레일즈 3.0.3 및 jquery-rails 0.2.7을 사용하고 있습니다)를 확인했으며 confirm() 메서드를 호출하는 포인트가 귀하와 다릅니다. 광산 쉽게 많은 교체 찾습니다

function allowAction(element) { 
    var message = element.data('confirm'); 
    return !message || (fire(element, 'confirm') && confirm(message)); 
} 

어쩌면 당신은 당신의 jquery-rails 보석을 업그레이드 (다시 실행 rails generate jquery:install)을 할 수 있습니까?

+0

확인을 위해,'allowAction' 함수는 제 'rails.js'와 같은 이름입니다. 복사하고 붙여 넣은 코드는 링크를 클릭 할 때'allowAction' 함수를 호출하는 이벤트 핸들러입니다. – nfm

관련 문제