2013-09-03 1 views
2

JavaScript 함수를 정의한 다음 erb 템플릿에서 호출하면 함수가 호출되지 않습니다. 왜? 이 링크를 클릭하면 경고가 표시되지만 표시되지는 않습니다.erb 템플릿에서 JavaScript 함수를 호출하려면 어떻게해야합니까?

= link_to "Add Sprout", new_sprout_path, remote: true 

컨트롤러 :

# sprouts/new.js.erb 
doSomething(); 

이 기능은 나의 JS 파일에 정의되어 있습니다 :

# javascripts/sprouts.js.coffee 
doSomething = -> 
    alert "yum ghum I am a new sprout." 

자바 스크립트

def new 
    @sprout = Sprout.new 
    respond_to { |format| format.js } 
end 

그런 다음 템플릿에 내가 함수를 호출 돌아오다. 콘솔에서 볼 수 있습니다. 그러나 나는 아무 경고도 보지 않는다. 왜 이것이 작동하지 않습니까?

내가 사용 레일 4.

답변

9
@doSomething = -> alert "yum ghum I am a new sprout." 

또는

window.doSomething = -> alert "yum ghum I am a new sprout." # I prefer this approach, as it's more explicit. 
+0

감사합니다. @를 사용하지 않는 코드가 왜 작동하지 않는지 이해할 수 있습니까? 예를 들어, –

+1

@ user2615384 JS 함수는 익명의 함수로 싸여 있습니다 -'(function() {var doSomething = function() {...}}). call (this); 템플릿이 템플릿을 실행하려고 할 때 존재합니다. '@ '를 사용하여 var 앞에 오는 것은'window.doSomething'과 동일하므로 함수를 "전역 적"또는보다 정확하게는 창 객체의 속성으로 만듭니다. – Kyle

+0

당신이 나를 때렸어, 카일. 어쨌든 내 응답은 다음과 같습니다. CoffeeScript에서는 변수 충돌이 발생하지 않도록 변수와 함수의 범위를 파일에 지정합니다. (컴파일 된 JavaScript를 보면, 코드가 IIFE로 싸여 있음을 알 수 있습니다.)'@'는'this'를 줄여서'this'가'window'가되면 변수를 사용할 수 있습니다 글로벌 범위에서. ('this'는 객체, 함수 등으로 생성 된 컨텍스트가 될 수도 있습니다.)'window'를 사용하면 전역 네임 스페이스에서 변수를 사용할 수 있습니다. – pdoherty926