2011-11-27 4 views
0

나는 Revealing Module Pattern을 사용하는 작은 스크립트를 만들고 있습니다.자바 스크립트 모듈 패턴 및 Coffeescript 공개

goold ol 'Javascript를 사용하면 모든 것이 잘 작동하지만 그걸 Coffeescript로 전송하는 방법을 궁금해하고 있습니다.

예를 들어이 걸릴 :

// revealing module pattern 
var anchorChange4 = function() { 

    // this will be a private property 
    var config = { 
     colors: [ "#F63", "#CC0", "#CFF" ] 
    } 

    // this will be a public method 
    var init = function() { 
     var self = this; // assign reference to current object to "self" 

     // get all links on the page 
     var anchors = document.getElementsByTagName("a"); 
     var size = anchors.length; 

     for (var i = 0; i < size; i++) { 
      anchors[i].color = config.colors[i]; 

      anchors[i].onclick = function() { 
       self.changeColor(this, this.color); // this is bound to the anchor object 
       return false; 
      }; 
     } 
    } 

    // this will be a public method 
    var changeColor = function (linkObj, newColor) { 
     linkObj.style.backgroundColor = newColor; 
    } 

    return { 
     // declare which properties and methods are supposed to be public 
     init: init, 
     changeColor: changeColor 
    } 
}(); 

는 커피 스크립트에서이 동일 :

anchorChange4 = -> 
    config = colors: [ "#F63", "#CC0", "#CFF" ] 
    init = -> 
    self = this 
    anchors = document.getElementsByTagName("a") 
    size = anchors.length 
    i = 0 

    while i < size 
     anchors[i].color = config.colors[i] 
     anchors[i].onclick = -> 
     self.changeColor this, @color 
     false 
     i++ 

    changeColor = (linkObj, newColor) -> 
    linkObj.style.backgroundColor = newColor 

    init: init 
    changeColor: changeColor 

initchangeColor는 전역 범위에 노출되고, 자바 스크립트가 잘 작동하지만 커피 스크립트의 일이 있기 때문에 실패 init 메소드가 없다.

이 공개 모듈 패턴을 CoffeeScript로 변환하려면 어떻게해야합니까?

나는 또한 더 나은 방법에 대한 제안이 열려 있습니다. 당신이 그 방법을 노출하는 새로운 JSON 개체를 반환하려면 ;-)

덕분에, 도미니크

+0

'while' 루프와'수동 i' 증가를 사용할 필요가 없습니다; [0 ... 크기]에서'for i '를 사용하십시오. –

답변

1

후 마지막 줄은

{ 
    init: init 
    changeColor: changeColor 
} 

대신 JSON 객체를 반환하려면 ...해야한다 그냥 changeColor. 커피는 함수에서 마지막 실행 문을 반환한다는 것을 기억하십시오. 반환 할 두 줄이 있습니다.

+0

트래비스가 정확합니다; 함수에서 객체 리터럴을 반환 할 때 중괄호를 사용합니다. 이 문제를 논의하기 위해 공개적인 문제가 있다고 생각합니다. –

2

CoffeeScript와 JavaScript 버전의 차이점은 CoffeeScript 버전에 정의 된 기능이 절대로 호출되지 않는다는 것입니다. JS 버전에서 함수의 반환 값은 anchorChange4에 저장되지만 CS 버전에서는 변수가 함수 자체를 가져옵니다.

당신은 커피 스크립트 코드의 처음과 마지막 라인에 약간의 괄호를 추가하여 변경할 수 있습니다

anchorChange4 = (-> 
    ... 
    changeColor: changeColor)() 
+0

하나의 문제가 해결되었으므로 외부에서 anchorChange4.changeColor를 호출 할 수 있습니다. :-) 하나의 문제가 남아 있습니다. 나는 Coffeescript를 사용하자마자 init 내에서 changeColor 메서드를 호출 할 수 없습니다. Javascript로'var self = this;'와'self.changeColor'로 이것을 할 수 있습니다 – dmnkhhn

+3

이 대답은 다른 방법으로'anchorChange4 = do -> ...'로 쓸 수 있습니다 –

+0

@dmnkhhn'self = this' 물건은 자바 스크립트와 동일합니다. 어떻게'init'을 호출합니까? –

관련 문제