1

だから私はノックアウトモデルをcoffeescriptクラスに変換しようとしていますが、これまでコーヒーを使用したことがなく、coffeescriptを介して(および私のクラスで)property.subscribeノックアウト関数を呼び出す方法の構文に問題があります。現在、コードは次のようになっています (要点をつかむために大幅に馬鹿げています)

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 メソッドを正しく呼び出す方法です。いくつかの異なる構文を試しましたが、役に立ちませんでした。誰でもこれに光を当てることができますか?事前に大歓迎です。

4

1 に答える 1

2

JavaScript に相当するものは次のようになります。

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

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

インスタンス変数参照にするために to を追加する必要があり、コンストラクターに入れるには別のレベルをインデントする必要が@あります。また、コロンは必要ありません。これは、プロパティ定義ではなく関数呼び出しです。次のように書くこともできます。hasResults@hasResults.subscribe@hasResults.subscribe

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

それが関数呼び出しであることを思い出させる必要がある場合。無名関数がワンライナーよりも大きい場合は、括弧を含める傾向があります。

太い矢印 ( =>)は、無名関数を現在のにバインドしますthis

太い矢印=>を使用して、関数を定義することも、その場で の現在の値にバインドすることもできますthis。これは、Prototype や jQuery などのコールバック ベースのライブラリを使用してeach、 に渡すイテレータ関数や で使用するイベント ハンドラ関数を作成する場合に役立ちますbind。太い矢印で作成された関数は、this定義されている場所のプロパティにアクセスできます。

var self = this;太い矢印は、 JavaScript イディオムの通常の置き換えです。

于 2012-10-25T17:23:36.323 に答える