Framework7 Starter Virtual List

by Maiki Nahara

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/framework7/4.1.1/js/framework7.bundle.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/framework7/4.1.1/css/framework7.bundle.css">
<!-- App root element -->
<div id="app">
  <!-- Statusbar overlay -->
  <div class="statusbar"></div>

  <!-- Left Panel with Reveal effect 
  <div class="panel panel-left panel-reveal">
    <div class="content-block">
      <p><a href="#" class="panel-close">Close me</a></p>
      <p><a href="#" data-panel="right" class="panel-close">Open Right Panel</a></p>
    </div>
  </div>
  <!-- Your main view, should have "view-main" class -->
  <div class="view view-main">
    <!-- Initial Page, "data-name" contains page name -->
<div class="page">
  <div class="navbar">
    <div class="navbar-inner sliding">
      <div class="title">Virtual List</div>
      <div class="subnavbar">
        <form data-search-container=".virtual-list" data-search-item="li" data-search-in=".item-title" class="searchbar searchbar-init">
          <div class="searchbar-inner">
            <div class="searchbar-input-wrap">
              <input type="search" placeholder="Search"/>
              <i class="searchbar-icon"></i>
              <span class="input-clear-button"></span>
            </div>
            <span class="searchbar-disable-button if-not-aurora">Cancel</span>
          </div>
        </form>
      </div>
    </div>
  </div>
  <div class="searchbar-backdrop"></div>
  <div class="page-content">
    <div class="list simple-list searchbar-not-found">
      <ul>
        <li>Nothing found</li>
      </ul>
    </div>
    <div class="list virtual-list media-list searchbar-found"></div>
  </div>
</div>
  </div>
</div>

JavaScript

// Dom7
var $$ = Dom7;
// Framework7 App main instance
window.app = new Framework7({
  root: '#app', // App root element
  id: 'io.framework7.testapp', // App bundle ID
  name: 'Framework7', // App name
  theme: 'ios', // Automatic theme detection
  panel: {
  },
  view: {
  },
  // App root data
  data: function() {
    return {
      user: {
        firstName: 'John',
        lastName: 'Doe',
      },
    };
  },
  methods: {
  },
  // App routes
  routes: [
  {
  path: '/'
  }]
});


// Init/Create main view
var mainView = app.views.create('.view-main', {
  url: '/'
});

// Dummy items array
var items = [];
for (var i = 1; i <= 10000; i++) {
  items.push({
    title: 'Item ' + i,
    subtitle: 'Subtitle ' + i
  });
}

var virtualList = app.virtualList.create({
  el: '.virtual-list',
  items: items,
  searchAll: function (query, items) {
    var found = [];
    for (var i = 0; i < items.length; i++) {
      if (items[i].title.toLowerCase().indexOf(query.toLowerCase()) >= 0 || query.trim() === '') found.push(i);
    }
    return found;
  },
itemTemplate:
      '<li>' +
        '<div class="item-inner">' +
          '<div class="item-title-row">' +
            '<div class="item-title">{{title}}</div>' +
          '</div>' +
          '<div class="stepper stepper-small stepper-raised">' +
        '<div class="stepper-button-minus"></div>' +
        '<div class="stepper-value">0</div>' +
        '<div class="stepper-button-plus"></div>' +
      '</div>' + 
          '<div class="item-subtitle">{{subtitle}}</div>' +
        '</div>' +
      '</li>',
  height: 63,
  on: {
  	itemsAfterInsert: function (vl, frag) {
    	$$('.virtual-list ul .stepper').forEach(s => {
    	app.stepper.create({el: s})
    })
  	}
  }
  });