如何访问控制器计算属性中的模型属性

时间:2014-04-15 14:14:01

标签: ember.js

我在Emberjs相当新。我有以下情况:

App.Message = DS.Model.extend
  value: DS.attr('string')

App.MessagesController = Ember.ArrayController.extend
  isAvailable: null

  isShowButton: (->
    #I want to check a property of each obj in the template's each loop below
    console.log @get('value') #but << this outputs `undefined`

    if @get('value') == 'test' and isAvailable
      return true
    else
      return false
  ).property('isAvailable', 'model.value')

在我的模板上:

{{#each controller}}
  {{value}}
  <!-- THE BUTTON ONLY SHOWS UP WHEN THE CONDITION ABOVE SATISFIES -->
  {{#if controller.isShowButton}}
    <input value='Test Button' type="submit">
  {{/if}}
{{/each}}

路线:

App.MessagesRoute = Ember.Route.extend
  setupController: (controller, model)->
    controller.set('model', @store.find('message'))

我错过了什么?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

你需要迭代你的数组,值不存在于集合中,它存在于集合中的每个项目上,有一个很好的帮助,getEach返回每个项目的值。它是这样使用的(赦免我的咖啡)

App.MessagesController = Ember.ArrayController.extend
  isAvailable: null
  isShowButton: (->
    #I want to check a property of each obj in the template's each loop below
    //console.log @get('value') #but << this outputs `undefined`
    values = @getEach('value')
    console.log values
    outerValue = false
    values.forEach(function(value){
      if value == 'test' and isAvailable
        outerValue = true
      //else
        //  I'm not sure if they all have to be test 
    });
    return outerValue
  ).property('isAvailable', 'model.@each.value')

你的路线应该真正使用模型钩

CcChat.MessagesRoute = Ember.Route.extend
  model: (params)->
    return @store.find('message')

更新

如果您尝试为控制器中的每个项目创建计算属性,您将要使用itemController,它指定用于数组中每个项目的控制器。

 App.MessagesController = Ember.ArrayController.extend
      itemController: 'foo'
      isAvailable: null

 App.FooController = Em.ObjectController.extend
      needs: ['messages'] 
      isShowButton: (->
        return @get('value') === 'test' && @get('controllers.messages.isAvailable')
      ).property('controllers.messages.isAvailable', 'value')