0

我正在尝试了解 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 handlebars 1.0.0 rc4 jquery 1.9.1 和 ember-data,我能说的唯一版本控制指示来自评论

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

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

4

3 回答 3

2

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

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

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

该指南确实说 ember 创建了一个ArrayController,但也许它不再创建了!?通过显式创建数组控制器让我知道它是否有效。如果是这样,我们可以让 ember 团队知道。

于 2013-06-13T09:32:34.847 回答
2

我今天在浏览入门指南时遇到了同样的问题,但似乎是由于拼写错误。

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

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

虽然您的问题似乎是正确的,但我想在这里发布,以防其他人遇到同样的问题。

于 2013-06-30T18:41:28.790 回答
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({});
于 2013-06-23T06:24:46.987 回答