我正试图绕过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)
是否有人知道的依赖问题或我做错了什么?
答案 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({});