@kartio

Как задать action в itemController?

Привет всем!

Решил посмотреть для себя emberjs. Фреймворк активно движется к 2.0 и даже те недавние примеры, что есть в сети, уже не работают с текущей версии без допила. Вопрос банальный, есть контроллер, который унаследован от ArrayController, в его шаблоне отображаю элементы, сам контроллер:

App.ListController = Ember.ArrayController.extend({
  itemController: 'item',
});


шаблон:

{{#each item in model}}
<div>
    <h1>{{item.name}}</h1>
    <a {{action "removeItem"}}>remove</a>
</div>
{{/each}}


сам itemController

App.ItemController = Ember.Controller.extend({
  actions: {
    removeItem: function() {
      var item = this.get('model');
      item.destroyRecord();
    }
  }
});


в итоге все отображается, но при клике на удалить получаю

Error: Nothing handled the action 'removeItem'. If you did handle the action, this error can be caused by returning true from an action handler in a controller, causing the action to bubble.

то есть action в дочернем контроллере не перехватывается, если вставить в ListController нужный action

removeList: function() {
      console.log('???');
      var item = this.get('model');
      console.log(item);
}


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

И может кто посоветовать какие-нибудь материалы по изучению, а то официальный гайд ответы на все вопросы не дает, он описывает все отдельными примерчиками, а какого-то комплексного подхода ко всему не дает. Даже немного обескураживает такой простой момент, что в гайде показывают как использовать ObjectController, но при попытке использования выдается информация, что уже deprecated, используйте просто Controller. Соответственно использование ObjectController и itemController непосредственно в шаблоне решает вопрос с экшеном в дочернем, но при переделке под "новые" стандарты (Controller и itemController в коде контроллера) работать перестает.

Может быть вопрос очень глупый, но я первый день его смотрю и пока не могу сообразить, где же я совершаю ошибку.
  • Вопрос задан
  • 158 просмотров
Пригласить эксперта
Ответы на вопрос 1
Kaer_Morchen
@Kaer_Morchen
Разрабатываю web-приложения.
Привет. Добро пожаловать в Ember сообщество.

А зачем тут вообще itemController? Я бы сделал так:

{{#each item in model}}
<div>
    <h1>{{item.name}}</h1>
    <a {{action "removeItem" item}}>remove</a>
</div>
{{/each}}

App.ListController = Ember.Controller.extend({
  actions: {
    removeItem: function(model) {
      model.destroyRecord();
    }
  }
});


Или если у вас предполагается какая-то логика элементов списка, то вам нужно использовать компоненты:

App.ItemListComponent = Ember.Component.extend({
  item: null,

  actions: {
    removeItem: function() {
      var item = this.get('item');
      item.destroyRecord();
    }
  }
});


{{#each item in model}}
    {{item-list item=item}} //извиняюсь за тавтологию
{{/each}}


то есть action в дочернем контроллере не перехватывается, если вставить в ListController нужный action

Передаются от контроллера к роуту, а затем от роута к роуту вверх по цепочке.

action-bubbling.png
И может кто посоветовать какие-нибудь материалы по изучению, а то официальный гайд ответы на все вопросы не дает, он описывает все отдельными примерчиками, а какого-то комплексного подхода ко всему не дает. Даже немного обескураживает такой простой момент, что в гайде показывают как использовать ObjectController, но при попытке использования выдается информация, что уже deprecated, используйте просто Controller. Соответственно использование ObjectController и itemController непосредственно в шаблоне решает вопрос с экшеном в дочернем, но при переделке под "новые" стандарты (Controller и itemController в коде контроллера) работать перестает.


Сейчас такого комплексного актуального туториала наверное и не найти, Ember развивается семимильными шагами.

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

Да не нормальный вопрос.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы