2016-09-22 2 views
2

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

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

Маршрутизатор

export default Ember.Route.extend({ 
    actions: { 
     doSomething: function(){ 
      alert('Router handled!'); 
     } 
    } 
}); 

Шаблон страницы

<button {{action "doSomething"}}>speak</button> 
{{myComponent onGetUsers=(action "doSomething")}} 

Компонент

export default Ember.Component.extend({ 
    actions: { 
     onPageClicked: function(pageNo){ 
      this.sendAction('onGetUsers', pageNo); 
     } 
    } 
}); 

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

Есть ли правило, что я не могу передавать действия компонентам нижестоящей линии? или я делаю что-то неправильно в коде?

+0

Я смог запустить маршрутизатор, используя действие на контроллере, используя this.send(), а не this.sendAction(), но мне все же хотелось бы знать, почему отправка действия маршрутизатора на компонент не работает , Если возможно. – hal9000

ответ

1

sendAction - вид старой концепции. Он по-прежнему функционирует, но в основном он заменен действиями закрытия, которые, как вам кажется, вы знаете.

Причина, по которой он в настоящее время не работает для действий маршрута, заключается в попытке создать закрытие для неизвестной цели. Во время ввода шаблона в DOM действие закрытия пытается определить точную функцию и направить ее при вызове. Это делается для простоты и поэтому действие может вернуть значение. Когда это действие находится на контроллере или родительском компоненте, это очень просто. Когда это действие происходит на маршруте, это не так просто, потому что ему нужно будет пройти цепочку маршрутов, чтобы найти ближайший маршрут, реализующий это действие. Кроме того, поскольку действия маршрута могут возвращать false, чтобы позволить действию пузыриться дальше, было бы сложно полностью поддержать.

Существует адмберт-cli, который поможет преодолеть этот пробел. Оформить заказ: https://github.com/DockYard/ember-route-action-helper. Вот JSBin, показывающий его в действии: http://jsbin.com/luruyegice/edit?html,js,output

+0

да, я думаю, я знаком с действиями по закрытию :-) просто не прошел. Я ошибочно предположил, что они будут доступны там, где их нет. Это отличное объяснение, но ответ перед этим на самом деле отвечает на вопрос решением, поэтому я чувствую, что должен его принять. Я все-таки хотел тебе почитать. Спасибо. – hal9000

+1

Наверное, я больше отвечал на комментарий, добавленный вами к вопросу, а не на вопрос. Просто попробуем дать вам некоторый фон и работать. –

2

sendActions - может использоваться для связи компонентов с компонентом.
send - может использоваться контроллером для маршрутизации связи. Вы не можете использовать любой способ.

Для связи компонентов для маршрутизации вы можете использовать нижний аддон.

ember install ember-route-action-helper 

Определяя действия на маршруте, вы можете вызвать его из template.hbs

<button {{action (route-action 'appRouteAction' 'fromApplication.hbs') }}>button</button> 

и Вы можете позвонить из моих-component.hbs

<button {{action (route-action 'appRouteAction' 'from MyComponent.hbs') }}>My-Component button</button> 

и если вы хотели бы сначала вызвать компонентное действие, а затем действие по маршруту,

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

{{my-component2 appRouteAction=(route-action 'appRouteAction')}} 

В моем-compoent2.hbs,

<button {{action 'appRouteAction' 'CallFromComponentActions-my-compoent2.hbs' }}>CallFromComponentActions</button> 

В моем-compoent2.js

import Ember from 'ember'; 
export default Ember.Component.extend({ 
    actions:{ 
    appRouteAction(fromWhere){ 
     console.log('appRouteAction in my-component '); 
     this.get('appRouteAction')(...arguments); 
    } 
    } 
}); 

Sample Twiddle - играть вокруг ember-route-action-helper-addon.

+1

было бы здорово, если бы он был перемещен в ядро ​​ember – SuperUberDuper

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