2014-11-09 60 views
0

如何將此函數移植到使用coffeescript類語法?Coffeescript轉換函數到類

App.PurchaseOrder = (uid) -> 
    binder = new App.DataBinder(uid, "purchase-order") 

    # Abstract all this out 
    purchase_order = 
    attributes: {} 

    # The attribute setter publish changes using the DataBinder PubSub 
    set: (attr_name, val) -> 
     @attributes[attr_name] = val 
     binder.trigger uid + ":change", [ 
     attr_name 
     val 
     this 
     ] 
     return 

    get: (attr_name) -> 
     @attributes[attr_name] 

    _binder: binder 

    # Subscribe to the PubSub 
    binder.on uid + ":change", (evt, attr_name, new_val, initiator) -> 
    purchase_order.set attr_name, new_val if initiator isnt purchase_order 
    return 

    purchase_order 

沿着這條線的東西,但是這不會工作,因爲@屬性未在構造函數中的binder.on中定義。

class App.PurchaseOrder 
    constructor: (@id) -> 
    @binder = new App.DataBinder(@id, "purchase-order") 
    @attributes = {} 

    # Subscribe to the PubSub 
    @binder.on @id + ":change", (evt, attr_name, new_val, initiator) -> 
     @attributes.set attr_name, new_val if initiator isnt @attributes 
     return 

    # The attribute setter publish changes using the DataBinder PubSub 
    set: (attr_name, val) -> 
    @attributes[attr_name] = val 
    @binder.trigger @id + ":change", [ 
     attr_name 
     val 
     this 
    ] 
    return 

    get: (attr_name) -> 
    @attributes[attr_name] 
+0

只是好奇 - 什麼是這裏的目標。這個問題有點超出'你''問題的範圍,但我很好奇 - 出於學習目的 - 你在這裏做什麼。 – 2014-11-09 18:01:56

+0

我有一個rails應用程序,我試圖用js類來擴充ruby類而不使用客戶端框架。在這種情況下,我設置了一個約定,客戶端採購訂單模型將自動綁定到具有特定數據屬性的html元素。因此,如果我有一個頁面,其中包含' new'並且我'purchase_order = new App.PurchaseOrder(1)然後'purchase_order.set(「state」,「pending」)'html元素將被更新。 – mpiccolo 2014-11-09 19:08:53

+1

這是一個WIP,但您可以在這裏查看源代碼:https://github.com/mfpiccolo/happy_place_demo。和演示在這裏:http://happy-place-demo.herokuapp.com/purchase_orders。通過在輸入字段中輸入id,您可以直接編輯表格。 – mpiccolo 2014-11-09 21:05:06

回答

1

如果你做這樣的事情

@binder.on @id + ":change", (evt, attr_name, new_val, initiator) -> 
    @attributes.set attr_name, new_val if initiator isnt @attributes 
    return 

那麼就意味着這個功能將在全球範圍內或在例如環境中被調用事件對象,但重點是this可能不指向你想要的對象。取而代之的->使用=>

@binder.on @id + ":change", (evt, attr_name, new_val, initiator) => 
    @attributes.set attr_name, new_val if initiator isnt @attributes 
    return 

然後this回調內部將進行靜態綁定,在這個例子中你的類的實例。

+0

小修正:我認爲事件處理程序中this的上下文將是事件本身,而不是全局上下文。 – 2014-11-09 11:59:47

+0

@JedSchneider好吧,你可能是對的,全部取決於回調的調用方式。更新了答案,在此更精確。 – 2014-11-09 13:19:14

+0

=>是我正在尋找的。謝謝。您認爲您可以將'@ attributes'更改爲'this',因爲我實際上想要在採購訂單實例上調用'set'而不是屬性對象。 – mpiccolo 2014-11-09 19:00:11

0

這個怎麼樣:

# Subscribe to the PubSub 
@binder.on @id + ":change", ((evt, attr_name, new_val, initiator) -> 
    @attributes.set attr_name, new_val if initiator isnt @attributes).bind @ 
return