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

Я использую ember-route-action-helper

У меня есть компонентная прокладка, которая выглядит так:

{{component-name model=model 
action1=(route-action "action1") 
action2=(route-action "action2") 
action3=(route-action "action3") 
action4=(route-action "action4") 
action5=(route-action "action5") 
action6=(route-action "action6") 
action7=(route-action "action7") 
action8=(route-action "action8")
action9=(route-action "action9") 
action10=(route-action "action10")
action11=(route-action "action11")
action12=(route-action "action12") 
action13=(route-action "action13") 
action14=(route-action "action14")
}}

P.S. В приведенных выше действиях не используются настоящие имена действий.

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

Это выглядит немного неуклюже из-за слишком большого количества действий. Есть ли способ представить эту же информацию в другом формате или записать ее где-нибудь еще в моем компоненте .hbs файл или .js файл?


person Sarthak    schedule 31.12.2016    source источник
comment
Почему вы не используете контроллеры? Что такое компонентная прокладка? Почему у вас так много действий?   -  person locks    schedule 31.12.2016
comment
Я избегаю использования контроллеров, если нет необходимости обрабатывать параметры запроса. Есть только автоматически сгенерированные контроллеры, которые создает Ember. Причина: Они уходят... когда-нибудь. Под оболочкой компонента я подразумеваю, что шаблон конкретного маршрута содержит только компонент верхнего уровня и больше ничего. Подробнее здесь: emberigniter.com/should-we-use-ember-controllers   -  person Sarthak    schedule 31.12.2016
comment
Даже если контроллеры устаревают в ближайшем будущем, нет смысла избегать их, если только вы не сможете использовать то, что их заменяет. Которого вы не можете, так как его еще не существует.   -  person Ed4    schedule 31.12.2016
comment
Недавно мы добавили часто задаваемые вопросы о будущих приложениях, которые должны иметь отношение к этому обсуждению: emberjs.com /learn/#faq-защита от будущего.   -  person locks    schedule 02.01.2017


Ответы (3)


Ваш вопрос эквивалентен вопросу «почему эта функция выглядит такой неуклюжей?»:

function(model, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14) {
    ....
}

Ответ таков: вам нужно разложить код по-другому. Никогда не бывает хорошей идеей иметь функцию с 15 аргументами, и то же самое касается компонентов по той же причине.

Есть несколько способов более четко разложить этот код на множители. Возможно, вместо этого некоторые из этих действий могут выполняться на специальных сервисах. Возможно, некоторые из них можно сгруппировать в промежуточные представления (например, модель, над которой действуют собственные действия). Вероятно, если бы вы не добавляли ненужный слой шаблона, создавая «прокладку», которая ничего не делает, вы могли бы напрямую передать каждое из этих действий в соответствующие дочерние компоненты, которые распределили бы их по логическим местам по всему шаблону.

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

person Ed4    schedule 31.12.2016

Я думаю, что есть один ярлык, вы можете попробовать напрямую вызвать route-action из компонента, не проходя весь путь вниз.

<button {{action (route-action 'appRouteAction') }}>My-Component button</button>

проверьте это ember-twiddle Я не уверен, это правильный подход?

person Ember Freak    schedule 31.12.2016
comment
Это будет работать, когда в компоненте нет логики, которую нужно выполнить, прежде чем всплывать действие на маршрут. Знаете ли вы также какие-либо альтернативы, которые можно написать, когда в компоненте сначала должна быть выполнена какая-то логика? - person Sarthak; 31.12.2016
comment
Я не нахожу никаких альтернатив, если сначала в компоненте выполняется какая-то логика. и я думаю, вам нужно отправить действия, как вы делаете это прямо сейчас. для этого ИМХО нет ярлыка. Кстати, вы вполне можете использовать контроллеры — см. controllers-are-dead -долговечные-контроллеры - person Ember Freak; 31.12.2016

Вы передаете действие (функцию) UP маршруту только для целей обработки данных, потому что он является владельцем данных.

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

Возможные решения,

  1. Поместите все общее состояние приложения (не связанное с данными) в service и внедрите его в компонент
  2. Вызовите метод модели (данные, переданные в компонент) внутри компонента, вместо этого позвольте маршруту выполнять работу
person Glass    schedule 22.02.2017