我有一個觀點,即允許用戶查看項目列表,然後選擇一個項目這反過來又使一些按鈕,就像這樣:使用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()
函數將需要傳遞事件中的selectedRows列表,而不僅僅是單個用戶。
最簡單的事情是實際添加一個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」由於項目是廣告,因此無法評估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不是數據 - 它是UI的關注點。當數據對象返回到服務器時,我們不希望存儲在數據庫中的UI狀態(尤其是選擇的那樣會改變用戶到用戶等)。另一個問題是這是一個可用於不同數據對象的可重用自定義元素。不保證不會有數據對象具有可能與UI無關的自己的isSelected屬性。 – RHarris