2013-06-12 2 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, но по какой-то причине это не происходит. Мне интересно, если это проблема с ember-данными?

Я использую все файлы из комплекта стартера, которые являются угольком 1.0.0 rc5 рулей 1.0.0 RC4 JQuery 1.9.1 и уголек-данные, единственным показание версий я могу сказать от комментария

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

Есть ли проблема зависимости, которую кто-то знает или я сделал что-то не так?

ответ

2

Я бы не сказал, что это проблема с данными ember, поскольку этот модуль отвечает только за разговоры с api и дает вам умные объекты модели.

Вы были правы, говоря, что ember генерирует неправильный тип контроллера. По умолчанию Ember, вероятно, сгенерирует Controller, когда вам понадобится ArrayController. Чтобы обойти эту проблему, просто создать пустой контроллер, как этого

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

Направляющих действительно говорят, что уголек создает ArrayController, но, возможно, не больше !? сообщите мне, если он работает, явно создав arraycontroller. Если это так, мы можем сообщить команде ember.

+0

ok -thanks. плохо попробуйте это в эти выходные и сообщите об этом. – tim

+1

Это работает. Ты прав. По умолчанию ember создает 'Controller' вместо параметра' ArrayController' 'Todo.TodosController = Em.ArrayController.extend ({}); 'явно исправляет проблему. – dhilipsiva

+0

Gotta love tutorials, которые содержат ошибки и имеют строки на каждой странице, говорящие «перезагрузите страницу, чтобы проверить наличие ошибок». –

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

сегодня у меня был точно такой же вопрос шел по Getting Started Guide, но оказалось, что из-за опечатки.

Согласно documentation, сгенерированный контроллер : Предполагаемый тип ArrayController. Я ворвался в источник Ember и нашел метод Ember.generateController, который генерирует контроллер в зависимости от контекста. Я установил точку останова и обнаружил, что, когда Эмбер пытался создать контроллер для маршрута «Тодос», контекст был неопределенным, поэтому основной контроллер был сгенерирован.

Работая назад оттуда, я установил точку останова на функцию модели моего маршрутизатора, чтобы увидеть, что она возвращает, но обнаружил, что ее вообще не называют. В этот момент я начал подозревать, что сделал что-то не так. И вот когда я заметил, что я назвал TodosRoute как TodosRouter (как у вас в исходном вопросе). Изменение имени на TodosRoute правильно вызвало мою модельную функцию, и все работало, как ожидалось.Не нужно было включать строку, которая явно создала TodosController как ArrayController.

Хотя кажется, что у вас было это правильно в вашем вопросе, я хотел опубликовать это здесь, если у кого-то другая проблема.

+0

Спасибо, за это. У меня лично был «Todos.TodosRoute = Ember.Route.Extend ({ ' вместо 'Todos.TodosRoute = Ember.Route.extend ({ '. – mcabrams

Смежные вопросы