2013-07-12 4 views
1

У меня есть это jsbin. Моя проблема заключается в том, что я пытаюсь вызвать action:Как вызвать действие на контроллере из шаблона

<a {{action controllers.nodesIndex.destroyAllRecords this}}><i class="icon-remove-circle"></i><a/> 

Но я получаю:

Uncaught Error: Nothing handled the event 'controllers.nodesIndex.destroyAllRecords' 

(Вы можете вызвать, чтобы при нажатии на иконку icon-remove-circle на верхнем правом углу, и проверка ошибка на консоли Js)

Но мой контроллер правильно настройки:

App.NodesIndexController = Ember.ArrayController.extend({ 
    destroyAllRecords: function() { 
     console.log('destroyAllRecords called'); 
    }, 
}); 

Что мне здесь не хватает?

+0

Спасибо. Ваш комментарий работал, просто * потому что * я ошибся, собрав jsbin. Я обновил jsbin, чтобы показать свою реальную реализацию: изменение заключается в том, что я пытаюсь вызвать действие в шаблоне 'nodes', а не в шаблоне' nodes/index', потому что это общая часть для всех узлов , Но из шаблона 'nodes' не найдено ни' controllers.nodesIndex.destroyAllRecords', ни 'destroyAllRecords'. Что я могу сделать, чтобы вызвать этот метод из шаблона 'nodes'? – dangonfast

+0

Вы должны поставить 'needs: ['nodesIndex']' в контроллере yor 'nodes' – Hyder

ответ

2

Поскольку контроллер для nodes/index шаблона является App.NodesIndexController, Вы должны отметить его как controllers.nodesIndex.destroyAllRecords, цель по умолчанию будет App.NodesIndexController, и поэтому вы можете просто сказать <a {{action destroyAllRecords}}>, как сказал @Thomas.

Также для получения длины записей просто укажите {{this.length}} вместо {{controllers.nodesIndex.length}}.

Я обновил ваш jsbin,

Вы должны сказать, как 'controllers.controllername.methodname' только если вы имеете в виду какой-то другой контроллер, чем контроллер для шаблона, и вы, чтобы дать имя контроллера в список, сказать, если вы хотите, чтобы вызвать метод вашего «профиля», следовавшего из шаблона вашего «узлов/индекса», необходимо затем

App.NodesIndexController = Ember.ArrayController.extend({ 
    needs: ['profile'], 
}); 

и в шаблоне,

<a {{action controllers.profile.methodname}}> 

Надеюсь, это поможет.

UPDATE: Направить решение и бункер в комментариях

+0

Спасибо, вы положили меня на правильный путь. Но если было недостаточно, чтобы определить «потребности». Мне также нужно было добавить в «NodesController» следующее: 'destroyAllRecords: function() {var nodesIndexController = this.get ('controllerlers.nodesIndex'); nodesIndexController.destroyAllRecords(); } ', а затем я могу вызвать' {{action destroyAllRecords}} 'в шаблоне узлов. Выполнение '{{action controllers.nodesIndex.destroyAllRecords}}' не срабатывало даже после определения 'needs'. Это выглядит сложным: я должен определить 'destroyAllRecords' дважды. Интересно, есть ли способ упростить это. – dangonfast

+0

Это shou; d've было 'a {{action destroyAllRecords this target = 'controllers.nodesIndex'}}', я обновил ваш [jsbin] (http://jsbin.com/ebagad/1#/nodes/ индекс). В таких сценариях вы можете просто определить действие в вашем 'nodeRoute', поскольку события' nodesController', 'nodesIndexContrller' и события всех дочерних маршрутов' nodesRoute' будут пузыриться до него, если вам явно не нужно событие в 'nodesIndexController '. – Hyder

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