All Projects β†’ dinony β†’ Od Virtualscroll

dinony / Od Virtualscroll

Licence: mit
πŸš€ Observable-based virtual scroll implementation in Angular

Programming Languages

typescript
32286 projects

Projects that are alternatives of or similar to Od Virtualscroll

ng-observe
Angular reactivity streamlined...
Stars: ✭ 65 (-51.13%)
Mutual labels:  rxjs, observable, reactive-programming
Evolui
A tiny reactive user interface library, built on top of RxJs.
Stars: ✭ 43 (-67.67%)
Mutual labels:  rxjs, reactive-programming, observable
observable-playground
Know your Observables before deploying to production
Stars: ✭ 96 (-27.82%)
Mutual labels:  rxjs, observable, reactive-programming
Redux Most
Most.js based middleware for Redux. Handle async actions with monadic streams & reactive programming.
Stars: ✭ 137 (+3.01%)
Mutual labels:  rxjs, reactive-programming, observable
rxjs-proxify
Turns a Stream of Objects into an Object of Streams
Stars: ✭ 34 (-74.44%)
Mutual labels:  rxjs, observable, reactive-programming
observe-component
A library for accessing React component events as reactive observables
Stars: ✭ 36 (-72.93%)
Mutual labels:  rxjs, observable, reactive-programming
Recycle
Convert functional/reactive object description using RxJS into React component
Stars: ✭ 374 (+181.2%)
Mutual labels:  rxjs, reactive-programming, observable
Cyclejs.cn
The Cycle.js Chinese documentation website.
Stars: ✭ 132 (-0.75%)
Mutual labels:  rxjs, reactive-programming
Withobservables
HOC (Higher-Order Component) for connecting RxJS Observables to React Components
Stars: ✭ 41 (-69.17%)
Mutual labels:  rxjs, observable
Rxemitter
RxEmitter = 🐟Rxjs + 🐑eventBus.
Stars: ✭ 43 (-67.67%)
Mutual labels:  rxjs, observable
Rocket.jl
Functional reactive programming extensions library for Julia
Stars: ✭ 69 (-48.12%)
Mutual labels:  reactive-programming, observable
Corsair
Corsair using RxJS, Immutable.js and WebGL/three.js
Stars: ✭ 36 (-72.93%)
Mutual labels:  rxjs, reactive-programming
Angular Interview Questions
A list of helpful Angular interview questions you can use to interview potential candidates, test yourself or completely ignore.
Stars: ✭ 967 (+627.07%)
Mutual labels:  rxjs, angular-component
Observer Util
Transparent reactivity with 100% language coverage. Made with ❀️ and ES6 Proxies.
Stars: ✭ 905 (+580.45%)
Mutual labels:  reactive-programming, observable
Inferno Most Fp Demo
A demo for the ReactJS Tampa Bay meetup showing how to build a React+Redux-like architecture from scratch using Inferno, Most.js, reactive programmning, and various functional programming tools & techniques
Stars: ✭ 45 (-66.17%)
Mutual labels:  rxjs, reactive-programming
Nestedtypes
BackboneJS compatibility layer for Type-R data framework.
Stars: ✭ 94 (-29.32%)
Mutual labels:  reactive-programming, observable
Rxfirebase
RxJS wrapper with extra goodies for the Firebase JavaScript SDK
Stars: ✭ 11 (-91.73%)
Mutual labels:  rxjs, reactive-programming
Angular1 Async Filter
Angular2 async pipe implemented as Angular 1 filter to handle promises & RxJS observables
Stars: ✭ 59 (-55.64%)
Mutual labels:  rxjs, observable
Lightweightobservable
πŸ“¬ A lightweight implementation of an observable sequence that you can subscribe to.
Stars: ✭ 114 (-14.29%)
Mutual labels:  reactive-programming, observable
Rx React Container
Use RxJS in React components, via HOC or Hook
Stars: ✭ 105 (-21.05%)
Mutual labels:  rxjs, observable

od-virtualscroll

GitHub license Module format Module format gzip size

Observable-based virtual scroll implementation in Angular.

Installation

npm i -S od-virtualscroll

Features

Let's you scroll efficiently through a humongous list/grid of items (with single predefined height) by recycling components and minimizing component updates.

  • Handles resizing
  • Efficient
    • Displays necessary amount of rows
    • Optimal updates on data change or resize
  • Supports tiling
  • Supports fixed number of columns
  • Reactive component
    • Observable interface for most parts
  • Supports AoT
  • API
    • Subscribe to key component observables
  • Plus
    • Debounce scrolling / resizing
    • Set scroll position, focus row or item via index
    • Customizable equality checking
    • A lot of code samples
  • Module formats
    • Ships FESM5 and FESM15
    • Ships ES5/UMD, ES5/ES2015 and ES2015/ES2015 exports ({{target}}/{{module}})

Demo

All examples are written in Angular 4 and provided in separate repositories to keep this repository simple.

Name Description
od-vsstatic / Demo Static example with 100k cells. Ideal for performance analysis and GC testing
od-vsdynamic / Demo Scroll through GIFs, without the risk of a CPU meltdown (GIPHY API)
od-vslist / Demo Render only 1 cell per row with dynamic width (randomuser API)
od-vsadvanced / Demo Shows more advanced API features and utilizes the auxiliary debug module
od-vscolors / Demo Just for fun

However, this repository also holds a minimalistic demo, to allow local development and AoT compilation.

Usage

Import the module and specify the cell and container styling (traditional layout or flexbox/... your choice).

// app.module.ts
import {NgModule} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {VirtualScrollModule} from 'od-virtualscroll';
import {AppComponent} from './app.component';

@NgModule({
  bootstrap: [AppComponent],
  declarations: [AppComponent],
  imports: [
    BrowserModule,
    VirtualScrollModule
  ]
})
export class AppModule {}

// app.component.ts
import {Component} from '@angular/core';
import {Observable} from 'rxjs';
import {IVirtualScrollOptions} from 'od-virtualscroll';

@Component({
  selector: 'app-shell',
  styles: [`...`],                      // <-- Style your cell and container
  template: `
    <od-virtualscroll [vsData]="data$" [vsOptions]="options$">
      <ng-template let-item let-row="row" let-column="column">
        <span>Row: {{row}}</span><br>
        <span>Column: {{column}}</span>
        {{item}}
      </ng-template>
    </od-virtualscroll>`
})
export class AppComponent {
  data$: Observable<any[]> = ... ;                      // <-- Define data
  options$: Observable<IVirtualScrollOptions> = ... ;   // <-- Define options
}

If you want to apply a traditional layout and wonder about the space between inline block elements - read this.

Inputs

Name Type Description
vsData Observable<any[]> Stream of data
vsOptions Observable<IVirtualScrollOptions> Stream of options
vsResize Observable<any> Stream of resize commands (optional, default: -\->)
vsUserCmd Observable<IUserCmd> Stream of user specific commands (optional, default: -\->)
vsDebounceTime number Debounce scroll and resize events [ms] (optional, default: 0)
vsEqualsFunc (prevIndex: number, curIndex:number) => boolean Function to determine equality, given two indicies in the array (optional, default: (p,c) => p === c))

IVirtualScrollOptions

export interface IVirtualScrollOptions {
  itemWidth?: number;
  itemHeight: number;
  numAdditionalRows?: number;
  numLimitColumns?: number;
}

The component requires either fixed-size cells (itemWidth, itemHeight) or a fixed number of cells per row (itemHeight, numLimitColumns).

Further, to improve scrolling, additional rows may be requested.

IUserCmd

Currently, the supported user specific commands are:

  • SetScrollTopCmd: Set scroll top to specific value
  • FocusRowCmd: Focus specific row index
  • FocusItemCmd: Focus specific item index

E.g. Focus row index 42.

data$ = // Data...;
userCmd$ = of(new FocusRowCmd(42)).pipe(delay(2000));
<od-virtualscroll [vsData]="data$" [vsUserCmd]="userCmd$">
  <!-- Your template -->
</od-virtualscroll>

API

ScrollObservableService

Inject the ScrollObservableService to subscribe to key component observables.

Name Type Description
scrollWin$ [IVirtualScrollWindow] Stream of the most important inner data structure
createRow$ [CreateRowCmd, ComponentRef<VirtualRowComponent>] Create row command and ComponentRef
removeRow$ [RemoveRowCmd, ComponentRef<VirtualRowComponent>] Remove row command and ComponentRef
shiftRow$ [ShiftRowCmd, ComponentRef<VirtualRowComponent>] Shift row command and ComponentRef
createItem$ [CreateItemCmd, ScrollItem, EmbeddedViewRef<ScrollItem>] Create item command, scroll item and EmbeddedViewRef
updateItem$ [UpdateItemCmd, ScrollItem, EmbeddedViewRef<ScrollItem>] Update item command, scroll item and EmbeddedViewRef
removeItem$ [RemoveItemCmd] Remove item command

The od-vsdynamic and od-vsadvanced examples show how the API may be used.

IVirtualScrollWindow

This interface provides pretty much all needed information.

export interface IVirtualScrollWindow {
  dataTimestamp: number;
  containerWidth: number;
  containerHeight: number;
  itemWidth?: number;
  itemHeight: number;
  numVirtualItems: number;
  numVirtualRows: number;
  virtualHeight: number;
  numAdditionalRows: number;
  scrollTop: number;
  scrollPercentage: number;
  numActualRows: number;
  numActualColumns: number;
  actualHeight: number;
  numActualItems: number;
  visibleStartRow: number;
  visibleEndRow: number;
}

It is used internally and may also be useful in consuming application components.

E.g.: The od-vsdynamic example.

Multiple Instances

The ScrollObservableService is registered on the VirtualScrollModule by default, so it is available on the root injector. However, if you have multiple instances of the scroll component, a singleton instance of the ScrollObservableService is not enough. Register the service on the wrapping component, via the providers property in the @Component decorator, so that the injector bubbling will stop on the Component level and will serve the right instance of the ScrollObservableService.

Check the feature/testMultiInstances branch for a simple example.

Further information

api.ts reveals the current API surface.

Module Format

The lib is AoT compatible and ships with FESM5 and FESM15 exports.

See Angular Package Format v4.0 for more info.

ES5/UMD, ES5/ES2015 and ES2015/ES2015 exports are also provided.

Upgrade

1.0.x -> 1.1.x

1.1.x uses Angular6/RxJS6.

0.2.x -> 1.x

Rename component input vsScrollTop to vsUserCmd.

NPM Scripts

npm run {{scriptName}}
Name Description
buildAll Build lib and demo
cleanAll Remove generated directories
buildDemo Build demo bundle with AoT compilation
tslint Lint lib and demo
serve Starts browser-sync for local development
explore Source map explorer of AoT compiled demo

Contribution & Contact

Contribution and feedback is highly appreciated.

GitHub

Twitter

License

MIT

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].