У меня есть мнение, что позволяет пользователю просматривать список элементов и выберите один элемент, который, в свою очередь, позволяет несколько кнопок, например так:Как включить множественный выбор из списка при использовании Aurelia repeat.for?
вид-модель
export class ListViewCustomElement{
@bindable rows= []
selectedRow= null
deleteRow() {
let event = new CustomEvent('delete-row',{
item: selectedItem,
bubbles: true
}
this.element.dispatchEvent(event)
}
вид
<!-- delete button enabled when user selected -->
<i class="button fa fa-times" if.bind="selectedRow" click.delegate="deleteRow()"></i>
<div repeat.for="row of rows" click.delegate="selectedRow = row">
<i class="fa ${selectedRow == row ? 'fa-check-circle' : 'fa-check-circle-o'}"></i>
${row.item1} ${row.item2}
</div>
parentview
<list-view rows.bind="users" delete-item.delegate="deleteUser($event)"></list-view>
Теперь мне нужно разрешить выбор нескольких пользователей. Мне все еще нужен значок для каждой строки, чтобы показать выбранную, если этот пользователь был выбран. Кроме того, моей функции deleteRow()
необходимо будет передать список выбранных строк в событии, а не только одного пользователя.
Проще всего было бы добавить свойство select к каждому элементу строки, но я не могу этого сделать, поскольку он искажает мои объекты данных.
ПОПЫТКА 1
вид-модель
//added to the above vm
selectedRows = []
selectClick(indexRef){
let index = this.selectedRows.indexOf(indexRef)
if(index < 0){
this.selectedRows.push(indexRef)
}
else{
this.selectedRows.splice(index,1)
}
}
вид
<!--Changed to call new function -->
<div ... click.delegate="selectClick($index)">
<i class="fa ${selectedRows.indexOf($index) < 0 ? 'fa-check-circle-o' : 'fa-circle-check'}"></i>
Это все работает, кроме значка в зрения - IndexOf Безразлично» t получает оценку, поскольку элементы являются объявлением Ded и удаляется из selectedRows
ПОПЫТКА 2
вид
<div ref="rowItems">
<div ref="rowItems[$index].unselected" repeat.for="row of rows"
click.delegate="rowItems[$index].unselected = !rowItems[$index].unselected">
<i class="fa ${rowItems[$index].unselected ? 'fa-check-circle-o' : 'fa-check-circle'}"></i>
Однако такой подход затрудняет включение/выключение кнопки удаления, а также вызывает проблемы, когда parentview на самом деле удаляет выбранные записи, потому что обновление обновления, но не выбранный флаг свойства rowItems
не сбрасывается.
Любые идеи о том, как наилучшим образом выполнить то, что мне нужно?
Почему бы не «загрязнить» данные с помощью 'isSelected'? является * выбранным * состоянием элемента, а не реальными данными? –
Нет, isSelected - это не данные - его проблема с пользовательским интерфейсом. когда объект данных возвращается на сервер, нам не нужно состояние пользовательского интерфейса (особенно что-то вроде выбранного, поскольку это может изменить пользователя для пользователя и т. д.), хранящегося в БД. Другая проблема заключается в том, что это повторно используемый пользовательский элемент, который работает на разных объектах данных. Нет никакой гарантии, что не будет объекта данных, у которого есть свое свойство isSelected, которое не может быть связано с пользовательским интерфейсом. – RHarris