@@ -16,6 +16,7 @@ import {
1616 Input ,
1717 IterableDiffer ,
1818 IterableDiffers ,
19+ model ,
1920 numberAttribute ,
2021 OnDestroy ,
2122 OnInit ,
@@ -194,7 +195,7 @@ export class DatatableComponent<TRow extends Row = any>
194195 * represented as selected in the grid.
195196 * Default value: `[]`
196197 */
197- @ Input ( ) selected : TRow [ ] = [ ] ;
198+ readonly selected = model < TRow [ ] > ( [ ] ) ;
198199
199200 /**
200201 * Enable vertical scrollbars
@@ -493,6 +494,19 @@ export class DatatableComponent<TRow extends Row = any>
493494
494495 /**
495496 * A cell or row was selected.
497+ * @deprecated Use two-way binding on `selected` instead.
498+ *
499+ * Before:
500+ * ```html
501+ * <ngx-datatable [selected]="mySelection" (select)="onSelect($event)"></ngx-datatable>
502+ * ```
503+ *
504+ * After:
505+ * ```html
506+ * <ngx-datatable [selected]="mySelection" (selectedChange)="onSelect({selected: $event})"></ngx-datatable>
507+ * <!-- or -->
508+ * <ngx-datatable [(selected)]="mySelection"></ngx-datatable>
509+ * ```
496510 */
497511 readonly select = output < SelectEvent < TRow > > ( ) ;
498512
@@ -682,15 +696,16 @@ export class DatatableComponent<TRow extends Row = any>
682696 * Returns if all rows are selected.
683697 */
684698 get allRowsSelected ( ) : boolean {
685- let allRowsSelected = this . rows && this . selected && this . selected . length === this . rows . length ;
699+ const selected = this . selected ( ) ;
700+ let allRowsSelected = this . rows && selected && selected . length === this . rows . length ;
686701
687702 if ( this . bodyComponent && this . selectAllRowsOnPage ( ) ) {
688703 const indexes = this . bodyComponent . indexes ;
689704 const rowsOnPage = indexes ( ) . last - indexes ( ) . first ;
690- allRowsSelected = this . selected . length === rowsOnPage ;
705+ allRowsSelected = selected . length === rowsOnPage ;
691706 }
692707
693- return this . selected && this . rows ?. length !== 0 && allRowsSelected ;
708+ return selected && this . rows ?. length !== 0 && allRowsSelected ;
694709 }
695710
696711 element = inject < ElementRef < HTMLElement > > ( ElementRef ) . nativeElement ;
@@ -1046,9 +1061,9 @@ export class DatatableComponent<TRow extends Row = any>
10461061 } ) ;
10471062
10481063 if ( this . selectAllRowsOnPage ( ) ) {
1049- this . selected = [ ] ;
1064+ this . selected . set ( [ ] ) ;
10501065 this . select . emit ( {
1051- selected : this . selected
1066+ selected : this . selected ( )
10521067 } ) ;
10531068 }
10541069 }
@@ -1186,9 +1201,9 @@ export class DatatableComponent<TRow extends Row = any>
11861201 onColumnSort ( event : SortEvent ) : void {
11871202 // clean selected rows
11881203 if ( this . selectAllRowsOnPage ( ) ) {
1189- this . selected = [ ] ;
1204+ this . selected . set ( [ ] ) ;
11901205 this . select . emit ( {
1191- selected : this . selected
1206+ selected : this . selected ( )
11921207 } ) ;
11931208 }
11941209
@@ -1230,14 +1245,13 @@ export class DatatableComponent<TRow extends Row = any>
12301245 // before we splice, chk if we currently have all selected
12311246 const first = this . bodyComponent . indexes ( ) . first ;
12321247 const last = this . bodyComponent . indexes ( ) . last ;
1233- const allSelected = this . selected . length === last - first ;
1234-
1235- // remove all existing either way
1236- this . selected = [ ] ;
1248+ const allSelected = this . selected ( ) . length === last - first ;
12371249
12381250 // do the opposite here
12391251 if ( ! allSelected ) {
1240- this . selected . push ( ...this . _internalRows . slice ( first , last ) . filter ( row => ! ! row ) ) ;
1252+ this . selected . set ( this . _internalRows . slice ( first , last ) . filter ( row => ! ! row ) as TRow [ ] ) ;
1253+ } else {
1254+ this . selected . set ( [ ] ) ;
12411255 }
12421256 } else {
12431257 let relevantRows : TRow [ ] ;
@@ -1250,25 +1264,24 @@ export class DatatableComponent<TRow extends Row = any>
12501264 relevantRows = this . rows . filter ( row => ! ! row ) ;
12511265 }
12521266 // before we splice, chk if we currently have all selected
1253- const allSelected = this . selected . length === relevantRows . length ;
1254- // remove all existing either way
1255- this . selected = [ ] ;
1267+ const allSelected = this . selected ( ) . length === relevantRows . length ;
12561268 // do the opposite here
12571269 if ( ! allSelected ) {
1258- this . selected . push ( ...relevantRows ) ;
1270+ this . selected . set ( relevantRows ) ;
1271+ } else {
1272+ this . selected . set ( [ ] ) ;
12591273 }
12601274 }
12611275
12621276 this . select . emit ( {
1263- selected : this . selected
1277+ selected : this . selected ( )
12641278 } ) ;
12651279 }
12661280
12671281 /**
12681282 * A row was selected from body
12691283 */
12701284 onBodySelect ( selected : TRow [ ] ) : void {
1271- this . selected . splice ( 0 , this . selected . length , ...selected ) ;
12721285 this . select . emit ( { selected } ) ;
12731286 }
12741287
0 commit comments