Передать ссылку на выбранный элемент DOM в обработчик действий в Ember
У меня есть набор кнопок, состояние которых я хочу переключать с помощью класса active
, Если бы у меня была одна кнопка, я бы связал active
Класс к свойству контроллера и переключить это свойство в обработчике кликов:
<button {{action 'toggle'}} class="{{active}}">model.title</button>
actions: {
toggle: function() {
this.set('active', true);
}
}
Но у меня есть несколько кнопок, поэтому я не уверен, что я могу связать. Было бы полезно, если бы я мог передать ссылку на нажатую кнопку обработчику действия, но я не уверен, как это сделать.
{{#each item in model}}
<button {{action 'toggle' referenceToButton}}>model.title</button>
{{/each}}
actions: {
toggle: function(buttonReference) {
// add `active` class to buttonReference
}
}
Каков наилучший способ сделать это?
4 ответа
Разве модель не то, что вы хотите передать, а не кнопка?
Тогда ваш переключатель может просто установить атрибут для элемента, который вы привязываете к своему классу кнопок.
{{#each item in model}}
<button {{bind-attr class="item.isActive:active"}} {{action 'toggle' item}}>model.title</button>
{{/each}}
actions: {
toggle: function(item) {
item.set('isActive', true);
}
}
Несмотря на то, что автор получил ответ, который хотел, я решил опубликовать ответ на то, что, как я считаю, было целью первоначального вопроса:
Как получить ссылку на выбранный элемент DOM из действия? с тех пор как я пришел сюда в поисках ответа на этот вопрос и не нашел его.
Я не могу найти способ получить фактический элемент, но вы можете получить корневой элемент представления (который оборачивает элементы, определенные в шаблоне) через this
:
шаблон:
<button {{action 'toggle' this}}>model.title</button>
контроллер, вид, компонент:
actions: {
toggle: function(event) {
// Get element (as in the return value of document.getElementById(id))
var viewElements = event.element;
var elementsInTemplate = viewElements.children;
var button = viewElements.getElementsByTagName('button');
//also can use getElementsByClassName, use jQuery etc.
}
}
Просто еще один ответ...
если вы поместите действие в onclick (или любое другое событие dom), вы получите объект JavaScript "event" в последнем параметре (так что вы можете использовать event.target, чтобы получить и манипулировать объектом)
Шаблон:
<button onclick={{action 'toggle' model.title}}>model.title</button>
Маршрут или контроллер:
actions: {
toggle (title, event) {
// TODO: use title
let element = Ember.$(event.target);
element.toggleClass("active");
return false;
}
}
Надеюсь, поможет
Вы можете представить active
собственность на items
{{#each item as |model|}}
<button {{action 'toggle' model}} class={{if model.active 'active'}}>{{model.title}}</button>
{{/each}}
если active=true
затем active
класс будет применен к кнопке.
actions: {
toggle: function(buttonReference) {
buttonReference.set('active', true);
}
}
Ответить на заголовок вопроса Pass a reference of the clicked DOM element to the action handler in Ember
,
1. Если вы используете компонент, то вы можете определить любой из этого списка имен событий в компоненте, который предназначен для получения нативных event
объект. например.,{{my-button model=model}}
export default Ember.Component.extend({
click(event){
//oncliking on this componen will trigger this function
return true; //to bubble this event up
}
})
2. Если вы используете HTML-тег, как button
затем вам нужно назначить (закрытие) действие встроенному обработчику событий.
{{#each item as |model|}}
<button onclick={{action 'toggle' model}}>{{model.title}}</button>
{{/each}}
В действиях хеш toggle
функция всегда получит родной браузер event
объект в качестве последнего аргумента.
actions:{
toggle(model,event){
}
}
В этом <button {{action 'toggle' model}}>{{model.title}}</button>
формат, действие toggle
не получит event
объект,
Очень хорошо объяснено в путеводителе ember https://guides.emberjs.com/v2.12.0/components/handling-events/