Javascript Revealing Модуль Шаблон и Кофейня - PullRequest
0 голосов
/ 28 ноября 2011

Я работаю над небольшим сценарием, который использует Шаблон модуля раскрытия .

С 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
    }
}();

равно этому в Coffeescript:

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

init и changeColor доступны для глобальной области видимости и Javascriptработает нормально, однако CoffeeScript не работает, потому что у него нет метода 'init'.

Что нужно сделать, чтобы преобразовать этот шаблон модуля выявления в CoffeeScript?

Я также открыт для предложений покак сделать это лучше; -)

Спасибо, Доминик

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Разница между версиями CoffeeScript и JavaScript заключается в том, что функция, определенная в версии CoffeeScript, никогда не вызывается.В версии JS возвращаемое значение функции помещается в anchorChange4, но в версии CS переменная получает саму функцию.

Это можно изменить, добавив несколько скобок в первую и последнюю строки кода CoffeeScript.:

anchorChange4 = (->
    ...
    changeColor: changeColor)()
1 голос
/ 28 ноября 2011

Если вы хотите вернуть новый объект JSON, предоставляющий доступ к этим методам, тогда последняя строка должна быть ...

{
  init: init
  changeColor: changeColor
}

Чтобы вернуть объект JSON, а не просто changeColor.Помните, что кофе возвращает последний оператор выполнения из функции, у вас было две строки, которые вы хотели вернуть.

...