Coder Social home page Coder Social logo

angular-virtual-scroll's Introduction

angular-virtual-scroll

Source for the sf.virtualScroll module for AngularJS

Intended as a replacement for ng-repeat for large collections of data and contains different solutions to the problem.

About

The module was originally developed as a proof of concept but has matured into a useable component. It isn't the ideal solution to the performance issues of large ng-repeat instances, but it does work as a drop-in replacement (with some caveats).

It started because I needed to display log messages and I didn't want to use paging. There were some excellent alternatives including some wrappers of jQuery grids, but nothing was using the ng-repeat pattern. I wrote a couple of articles explaining myself as I went along:

There should be an online demo here: http://demo.stackfull.com/virtual-scroll/

Usage

Whether you build the component, copy the raw source or use bower (see below), the end result should be included in your page and the module sf.virtualScroll included as a dependency:

angular.module('myModule', ['sf.virtualScroll']);

Then use the directive sf-virtual-scroll just as you would use ng-repeat.

<div class="viewport">
  <div>
    <table>
      <tbody>
        <tr sf-virtual-repeat="line in book.lines"><th>{{$index}}: <td>{{line}}
    </table>
  </div>
</div>

<div class="viewport real">
  <ul>
    <li ng-repeat="thing in simpleList">{{thing}}</li>
  </ul>
</div>

If you want to expose the scroll postion (to simulate an atEnd event for example), use ng-model and you have access to the scroll properties.

Check out the examples in the demo folder for all the details.

Limitations

First up, the obligatory warning: virtual scrolling is usually the wrong approach. If you want to display really large lists, your users will probably not thank you for it: filtering can be a more friendly way to tame the data. Or if you have performance problems with angular bindings, one of the "bind-once" implementation may make more sense.

Tables are problematic. It is possible to use sf-virtual-repeat in a <tr> to create table rows, but you have to be very careful about your CSS.

The element having the sf-virtual-repeat needs to be contained within an element suitable for use as a viewport. This suitability is the main difficulty as the viewport must contain a single element (and no text) and this contained element must be explicitly sizable. So a table will need 2 parent divs for example.

The collection must be an array (not an object) and the array must not change identity - that is, the value on the scope must remain the same and you should push, pop, splice etc. rather than re-assigning to the scope variable. This is a limitiation that might be removed in future versions, but for now it's a consequence of watching the collection lightly.

Developing

Grunt is used as the build tool, so you will need node and npm installed. Since v0.4, grunt has 2 parts: the heavy lifting package grunt and the shell command grunt-cli. If you haven't already installed grunt-cli globally, do so now with:

sudo npm install -g grunt-cli

To run the simple demo, install the npm dependencies for the build tools and go:

npm install
grunt demo

You can now view the demo at http://localhost:8000/

Build with grunt dist and choose a file from the dist directory.

Using the component

For use with bower, there is a separate repo containing just the built artifacts here: angular-virtual-scroll-bower. You can add the component to your project with:

bower install angular-virtual-scroll

Or by adding a line to your component.json file.

If you are using grunt for your build, consider using a plugin like bowerful.

All comments to [email protected]

ChangeLog

0.6.0 (19 Jan 2014)

  • [ENHANCEMENT #9] allow filters in the collection expression
  • [FIX #12] improved stability in the face of collection changes

0.5.0 (28 Jul 2013)

  • [FIX #6] be more careful searching for a viewport (tables again)
  • [ENHANCEMENT #2]configurable watermark levels
  • more demos.

0.4.0 (11 May 2013)

  • [ENHANCEMENT #4] prevent tables messing up the viewport
  • expose state variables as models

0.3.1 (14 Apr 2013)

  • added "auto-scroll" feature to the virtual repeater
  • fleshed out demos in place of tests

0.3.0 (17 Mar 2013)

First "dagnamit" fix.

0.2.0 (16 Mar 2013)

First sight of daylight.

angular-virtual-scroll's People

Contributors

stackfull avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.