为什么使用itemController呈现空项的集合?

时间:2014-09-24 03:21:38

标签: ember.js coffeescript emblem.js

我正在学习Ember,同时遵循ember-cli的todomvc教程:http://thetechcofounder.com/getting-started-with-ember-js-using-ember-cli/

我在编辑待办事项的部分中,需要在editTodo中添加TodoController操作。到目前为止一直很好,但它也说在itemController把手助手上使用each告诉每个待办事项使用特定的控制器

enter image description here

当我在模板中添加itemControllereach时(使用Emblem.js:each itemController='todo'),模板不再呈现集合中每个项目的标题,它只会将它们呈现为空白:

enter image description here

我无法理解为什么会这样。

模板提取

section#main
  ul#todo-list
    each
      li class={isCompleted:completed}
        if isEditing
          input.edit
        else
          = input class='toggle' type='checkbox' checked=isCompleted
          label{action 'editTodo' on='doubleClick'}= title
          button.destroy
  input#toggle-all type='checkbox'

控制器提取

`import Ember from 'ember'`

TodoController = Ember.Controller.extend
  actions:
    editTodo: ->
      @set 'isEditing', true

`export default TodoController`

1 个答案:

答案 0 :(得分:4)

项目控制器必须是 Ember.ObjectController 才能成功呈现每个项目及其关联数据。 ObjectControllers用于装饰ArrayController中的各个项目。使用' TodosListController'中的itemController属性。 ArrayController声明项目控制器:

    itemController: 'todo',

然后,当创建' todo'项目控制器类定义如参考教程中所建议的那样,观察Ember CLI'生成控制器'命令将创建一个标准的Ember控制器。标准控制器和ArrayControllers代表多个项目(例如' TodosController'或者#TodosListController')。因此,TodoController应该扩展Ember.ObjectController以表示单个项目:

    `import Ember from 'ember'`

    TodoController = Ember.ObjectController.extend
      actions:
        editTodo: ->
          @set 'isEditing', true

    `export default TodoController`

标准的Ember.Controller,与问题一起发布,无法正确显示每个单独的待办事项,当通过'每个'帮助器,因为标准控制器的模型引用了所有类型的记录的过滤集合,而不是特定的单个待办事项记录。

我已经创建了一个JS Bin来说明 - 只需在使用Ember.Controller和使用Ember.ObjectController进行' TodoController'之间切换,看看标准控制器是否失败。

此外,不是问题的原因,但是如果它被忽略了,list-item类属性声明中缺少'isEditing:editing':

    section#main
      ul#todo-list
        each itemController='todo'
          li class={isCompleted:completed, isEditing:editing} // <-- here
            if ...