WedX - журнал о программировании и компьютерных науках

Ember todos: содержимое Ember.CollectionView должно реализовывать Ember.Array

Я пытаюсь разобраться с Ember и прохожу учебник todos. Я застрял на этапе отображения данных модели здесь https://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-данными?

Я использую все файлы из стартового набора: 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)

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

12.06.2013

Ответы:


1

Я бы не сказал, что это проблема с данными Ember, поскольку этот модуль отвечает только за общение с API и предоставление вам умных объектов модели.

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

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

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

13.06.2013
  • Это работает. Ты прав. По умолчанию ember создает Controller вместо ArrayController, настройка Todo.TodosController = Em.ArrayController.extend({}); явно устраняет проблему. 26.07.2013
  • Должен любить учебники, которые содержат ошибки и имеют строки на каждой странице, говорящие, что перезагрузите страницу, чтобы проверить наличие ошибок. 26.09.2013

  • 2

    У меня была точно такая же проблема сегодня, когда я просматривал Руководство по началу работы, но, похоже, это было связано с опечаткой.

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

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

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

    30.06.2013
  • Спасибо за это. У меня лично было Todos.TodosRoute = Ember.Route.Extend({ вместо Todos.TodosRoute = Ember.Route.extend({ . 02.12.2013

  • 3

    Добавление строки, предложенной Гевиусом, исправило эту проблему для меня. Для пояснения мой файл 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({});
    
    23.06.2013
    Новые материалы

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

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]