Ember todos:Ember.CollectionView的内容必须实现Ember.Array

时间:2013-06-12 21:13:58

标签: ember.js

我正试图绕过Ember并完成todos教程。我在这里停留在显示模型数据步骤上 http://emberjs.com/guides/getting-started/displaying-model-data/

这是我从教程中复制并粘贴的javascript:

window.Todos = Ember.Application.create();

Todos.Router.map(function () {
  this.resource('todos', { path: '/' });
});

Todos.TodosRoute = Ember.Route.extend({
  model: function () {
    return Todos.Todo.find();
  }
});

Todos.Store = DS.Store.extend({
  revision: 12,
  adapter: 'DS.FixtureAdapter'
});

Todos.Todo = DS.Model.extend({
  title: DS.attr('string'),
  isCompleted: DS.attr('boolean')
});

Todos.Todo.FIXTURES = [
  {
    id: 1,
    title: 'Learn Ember.js',
    isCompleted: true
  },
  {
    id: 2,
    title: '...',
    isCompleted: false
  },
  {
    id: 3,
    title: 'Profit!',
    isCompleted: false
  }
];

然后这是我的车把模板:

...
          {{#each controller}}
            <li>
              <input type="checkbox" class="toggle">
              <label>{{title}}</label><button class="destroy"></button>
            </li>
          {{/each}}

然而我收到此错误

Uncaught Error: assertion failed: an Ember.CollectionView's content must implement Ember.Array. You passed <(generated todos controller):ember257> 

在我看来,Ember生成的默认控制器对象应该是Ember.Array类型,但由于某种原因它不会发生。我想知道它是否是ember-data的问题?

我正在使用入门套件中的所有文件 ember 1.0.0 rc5 车把1.0.0 rc4 jquery 1.9.1 和ember-data,我能告诉的唯一版本控制指示来自评论

// Last commit: 3981a7c (2013-05-28 05:00:14 -0700)

是否有人知道的依赖问题或我做错了什么?

3 个答案:

答案 0 :(得分:2)

我不会说它是ember数据的问题,因为该模块只负责与api交谈并为你提供聪明的模型对象。

你是对的,说ember正在生成错误类型的控制器。默认情况下,当您需要的是Controller时,Ember可能会生成ArrayController。要解决这个问题,只需创建一个像这样的空控制器

Todo.TodosController = Em.ArrayController.extend({});

该指南确实说ember创建了一个ArrayController,但也许它已经不存在了!?通过显式创建一个arraycontroller,让我知道它是否有效。如果确实如此,我们可以让灰烬团队知道。

答案 1 :(得分:2)

我今天在完成“入门指南”时遇到了同样的问题,但似乎是由于输入错误。

根据documentation,生成的控制器 应该是ArrayController类型。我挖到了Ember源代码,发现了Ember.generateController方法,它根据上下文生成控制器。我设置了一个断点,发现当Ember试图为“Todos”路径创建控制器时,上下文未定义,因此生成了基本控制器。

从那里开始向后工作,我在路由器的模型函数上设置一个断点,看看它返回的是什么,但发现它根本没有被调用。在这一点上,我开始怀疑我做错了什么。就在那时我注意到我已将TodosRoute命名为TodosRouter(正如您在原始问题中所说的那样)。正确地将名称更改为TodosRoute称为我的模型函数,一切都按预期工作。没有必要将显式创建TodosController的行包含为ArrayController。

虽然您的问题看起来是正确的,但我想在此发帖,以防其他人遇到同样的问题。

答案 2 :(得分:0)

添加Gevious建议的行为我纠正了这个问题。为了澄清我的router.js文件现在看起来像这样:

 Todos.Router.map(function(){
   this.resource('todos', {path: '/'});
});

Todos.TodosRoute = Ember.Route.extend({
  model: function () {
    return Todos.Todo.find();
  }
});

Todos.TodosController = Em.ArrayController.extend({});
相关问题