2014-11-09 3 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 

Что-то вдоль линий это, однако, это не будет работать, потому что @attributes не определен в 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

Просто любопытно - что цель здесь. Вопрос немного выходит за рамки «вашего» вопроса, но мне любопытно - для учебных целей - что вы здесь делаете. –

+0

У меня есть приложение rails, которое я пытаюсь увеличить классы ruby ​​с помощью классов js без использования рамки на стороне клиента. В этом случае я устанавливаю соглашение о том, что модель заказа на покупку на стороне клиента будет автоматически привязана к элементам html, которые имеют конкретные атрибуты данных. Поэтому, если у меня есть страница с new 'и я делаю' purchase_order = new App.PurchaseOrder (1) ' затем 'purchase_order.set (" state "," pending ")' элемент html будет обновлен. – mpiccolo

+1

Это WIP, но вы можете проверить исходный код здесь: https://github.com/mfpiccolo/happy_place_demo. и демо здесь: http://happy-place-demo.herokuapp.com/purchase_orders. Введя идентификатор в поле ввода, вы можете напрямую редактировать таблицу. – mpiccolo

ответ

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' в обработчике события будет самим событием, а не глобальным контекстом. –

+0

@JedSchneider хорошо, вы можете быть правы, все зависит от способа вызова callback. Обновлен ответ, чтобы быть более точным. –

+0

The => это то, что я искал. Спасибо. Как вы думаете, вы можете изменить '@ attributes' на' this', потому что я действительно хотел называть 'set' на экземпляре заказа на поставку, а не на объекте атрибутов. – mpiccolo

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 
Смежные вопросы