2013-06-12 52 views
0

我试图让我的头在Ember附近,并通过todos教程。我陷在这里显示的模型数据的步骤 http://emberjs.com/guides/getting-started/displaying-model-data/Ember todos:Ember.CollectionView的内容必须实现Ember.Array

这是我复制的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类型,但它不会因为某种原因而发生。我想知道这是否是一个呃数据的问题?

我使用的所有文件从入门工具包它们 烬1.0.0 RC5 车把1.0.0 RC4 的jQuery 1.9.1 和烬数据,唯一的版本指示我可以告诉是从评论

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

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

回答

2

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

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

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

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

+0

好的,谢谢。生病尝试了这个周末,让你知道。 – tim

+1

这工作。你是对的。默认情况下,ember创建'Controller'而不是'ArrayController'设置'Todo.TodosController = Em.ArrayController.extend({});'明确地解决了这个问题。 – dhilipsiva

+0

得爱的教程,其中包含的错误,并在每个页面上有线说“重新加载您的网页来检查错误”。 –

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({}); 
2

我今天有这个完全一样的问题通过入门指南行走,但它似乎是由于一个错字。

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

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

虽然看起来你的问题是正确的,但我想在此发布此信息以防别人遇到同样的问题。

+0

谢谢,为此。我个人有'Todos.TodosRoute = Ember.Route.Extend(而不是'Todos.TodosRoute = Ember.Route.extend({0})。 – mcabrams

相关问题