2012-10-25 40 views
1

所以我想轉換成一個咖啡腳本類的淘汰賽模型,直到現在還沒有用過咖啡,在如何調用property.sub淘汰賽功能, 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方法正確,ive嘗試了幾種不同的語法,但無濟於事。任何人都可以對此有所瞭解嗎?非常感謝提前。

回答

2

你的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) 
) 

如果你需要提醒你這是一個函數調用。如果匿名函數大於一行,我傾向於包含括號。

fat-arrow (=>)結合匿名函數到當前this

箭頭=>可以用於兩者的脂肪定義一個函數,並且將其綁定到的this的電流值,右當場。當使用基於回調的庫(如Prototype或jQuery)創建迭代器函數以傳遞至each或事件處理函數與bind一起使用時,這很有用。使用胖箭頭創建的函數能夠訪問定義它們的this的屬性。

胖箭頭通常替代了var self = this; JavaScript成語。

+0

我實際上嘗試過,但是我得到了一個解析錯誤,意外{在第x行 - 但是,因爲你引導我在正確的方向,我能夠通過以下方式獲得它:@ hasResults.subscribe(newValue)=> @ displayResults(newValue)(注意訂閱後顯然需要不冒號) – thrice801

+0

,謝謝你的詳細解釋! – thrice801

+0

@ thrice801:對不起,我錯過了冒號。無論如何,我更新了答案以涵蓋那部分。 –