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})
})
}
}
});