Преобразование модели нокаута в синтаксис класса coffeescript

Итак, я пытаюсь преобразовать нокаутную модель в класс coffeescript, до сих пор не использовал кофе, у меня проблемы с синтаксисом при вызове функции нокаута property.subscribe через coffeescript (и в моем классе). В настоящее время код выглядит так (сильно тупой, чтобы понять суть)

var Autocomplete = function(){
  var self = this;
  self.displayResults = ko.observable(false);
  self.results = ko.observableArray([]);
  self.hasResults = ko.observable(false);

    self.hasResults.subscribe(function(newValue){
        if(newValue == true) {
            self.displayResults(true);
        } else {
            self.displayResults(false);
        }
    });

}

Но в основном то, что я пытаюсь сделать, это:

class ClientAutoComplete
  constructor: ->
    @hasResults = ko.observable(false)  
    @results = ko.observableArray([])  
    @displayResults = ko.observable(false)

  hasResults.subscribe: (newValue) ->
    @displayResults(newValue)

Чего я не могу понять, так это того, как правильно вызвать метод property.subscribe, я пробовал пару разных синтаксисов, но безрезультатно. Кто-нибудь может пролить свет на это? Заранее высоко ценится.


person thrice801    schedule 25.10.2012    source источник


Ответы (1)


Эквивалентом вашего JavaScript будет следующее:

class ClientAutoComplete
  constructor: ->
    @displayResults = ko.observable(false)
    @results = ko.observableArray([])  
    @hasResults = ko.observable(false)  

    @hasResults.subscribe (newValue) =>
      @displayResults(newValue)

Вы должны добавить @ к hasResults, чтобы сделать его ссылкой на переменную экземпляра, и вам нужно сделать отступ @hasResults.subscribe еще на один уровень, чтобы получить его в конструкторе. Вам также не нужно двоеточие в @hasResults.subscribe, это вызов функции, а не определение свойства; вы также можете написать это так:

@hasResults.subscribe( (newValue) =>
  @displayResults(newValue)
)

если вам нужно напомнить, что это вызов функции. Я склонен включать круглые скобки, если анонимная функция больше, чем однострочная.

жирная стрелка (=>) связывает анонимную функцию с текущим this:

Толстую стрелку => можно использовать как для определения функции, так и для привязки ее к текущему значению this прямо на месте. Это полезно при использовании библиотек на основе обратного вызова, таких как Prototype или jQuery, для создания функций итератора для передачи в each или функций обработчика событий для использования с bind. Функции, созданные жирной стрелкой, могут получить доступ к свойствам this, где они определены.

Жирная стрелка — это обычная замена идиомы var self = this; JavaScript.

person mu is too short    schedule 25.10.2012
comment
На самом деле я пытался это сделать, однако я получил неожиданную ошибку синтаксического анализа { в строке x - но, поскольку вы направили меня в правильном направлении, я смог заставить его работать с помощью: @hasResults.subscribe (newValue) => @displayResults (newValue) (обратите внимание на очевидную необходимость без двоеточия после подписки) - person thrice801; 25.10.2012
comment
@thrice801: Извините, я пропустил это двоеточие. Во всяком случае, я обновил ответ, чтобы охватить и эту часть. - person mu is too short; 25.10.2012