17

我想在 Coffeescript 中实现以下 Javascript 代码

App.ItemView = Ember.View.extend({
    classNameBindings: ['itemId'],
    itemId: function() {
        console.log(this.get('content'));
        return "item-%@".fmt(this.get('content.id'));
    }.property('content.id'),
    templateName: 'item'    
}); 

这是我到目前为止在咖啡脚本中的内容:

App.ItemView = Ember.View.extend(
    classNameBindings: ['itemId']

    itemId: ->
        console.log this.get('content')
        contentId = this.get('content.id')
        "item-#{contentId}");
    .property('content.id')

    templateName: 'item'    
)

我得到:

Error: Parse error on line 11: Unexpected '.'

问题似乎与.property('content.id') . 我不知道这如何转化为 Coffeescript。如何在 Coffeescript 中正确实现此视图?

4

3 回答 3

42

已经很久了,但我认为应该这样写:

App.ItemView = Ember.View.extend(
  classNameBindings: ['itemId']

  itemId: (->
    console.log this.get('content')
    contentId = this.get('content.id')
    "item-#{contentId}");
  ).property('content.id')

  templateName: 'item'    
)
于 2012-10-08T08:25:21.370 回答
4
itemId: (->
  content = @get 'content'
  if content
    return 'item-%@'.fmt(content.get 'id')
  null
).property('content.id')

您必须保护计算属性免受可能尚未定义的值的影响。也就是说,如果内容对象上已经有一个 id 属性,那么您的代码就可以了。如果内容未定义,那么您将无法查找其 ID 属性,并且您可能会看到投诉。

你也可以使用

itemId: Ember.computed(->
  ..
).property('content.id')

以及观察者的类似模式。事实上,观察者也可以在没有条件的情况下完成同样的事情:

itemId: null

contentIdChanged: (->
  @set 'itemId', 'item-%@'.fmt(@get 'content.id')
).observes('content.id')
于 2012-10-08T18:21:27.607 回答
2

我喜欢用Ember.computed.

itemId: Ember.computed 'firstName', 'lastName', ->
  "#{@get('firstName')} #{@get('lastName')}"
于 2014-04-03T11:57:16.027 回答