Framework7 索引列表插件的问题

前言

Framework7 作为移动端的开发框架的优良之处已经无需多言。现在已经有了 React 和 Vue 版本,之前在项目中用过 F7 + vue 的开发方式,无论是效率还是产出都近乎完美。有时间的话可以单独写篇文章详细介绍 Framework7,并与其它框架做对比。

插件的问题

对于 Framework7 插件的开发我就不多言了,官方文档很详细。Framework7 的插件开发确实很简单,但有些需要特殊对待的问题,我想通过索引插件这个例子简单说说我的解决方法。

索引列表在移动端算是比较常见的需求,我在工作中也遇到了这个需求,框架选用的是 Framework7,所以就直接用这个现成的插件了。插件代码如下:

Framework7.prototype.plugins.indexedlist = function (app, params) {
    var $ = window.Dom7;

    function initIndexedList(page) {
        var eventsTarget = $(page.container).find(‘.list-index‘);
        if (eventsTarget.length === 0) return;

        var pageContent = $(page.container).find(‘.page-content‘);

        ... 

    }

    return {
        hooks: {
            pageInit: initIndexedList,
        }
    };
};    

初始化 Framework7:

var myApp = new Framework7({
    modalTitle: ‘My App‘,
    pushState: true,
    ...
});

Framework7 的插件都是在 F7 初始化之后立即执行,所以动态生成的数据就有问题了。虽然官方文档提供了很多钩子,但都不太合适。整个列表应该是获取接口数据之后动态生成的,所以为了保证先载入数据再执行 Framework7,我最初想到的方法就是等到页面所有数据都请求完成之后再初始化 Framework7,不过这种方式稍微有些不友好。

$.when(ajax1,ajax2,ajax3).done(function(res1,res2,res3){

    new Framework7({
    ...
    });

});

插件改造

最后的办法只能是修改插件,最终尝试了很长时间才找到办法。初始化 F7 时可以给插件传递参数,如下:

var myApp = new Framework7({
    modalTitle: ‘My App‘,
    pushState: true,
    /*
    Here comes your plugin parameters that will be passed to your plugin in case of parameter name is the same as plugin name:
    */
    myPlugin: {
        foo: ‘bar‘
    }
});

这样的话我们可以在插件函数执行之前加一个判断:

Framework7.prototype.plugins.indexedlist = function (app, params) {
    var $ = window.Dom7;

    // the plugin will not initialize automaticly
    if (!params.init) return;

    function initIndexedList(page) {
      var eventsTarget = $(page.container).find(‘.list-index‘);
        if (eventsTarget.length === 0) return;

        var pageContent = $(page.container).find(‘.page-content‘);

      ...
    }

    return {
        hooks: {
            pageInit: initIndexedList,
        }
    };
};

其次插件的钩子函数也要删除,简单说一下,插件的返回值是一个钩子函数,表示页面加载完成立即执行 initIndexedList() 函数,其参数是一个 page 对象,其中 page.container 就表示 .page 元素。删除钩子函数之后我们可以通过 params 参数来传递 container ,这样反而可以增加插件的灵活性。

Framework7.prototype.plugins.indexedlist = function (app, params) {
    var $ = window.Dom7;

    // the plugin will not initialize automaticly
    if (!params.init) return;

    function initIndexedList(page) {
      var eventsTarget = $(page.container).find(‘.list-index‘);
        if (eventsTarget.length === 0) return;

        var pageContent = $(page.container).find(‘.page-content‘);

      ...

    }

    initIndexedList(params);
};

插件修改后的调用方式,初始化 F7 时可以将插件的 init 设为 false

var indexedlist = new Framework7({
    indexedlist:{
        init:true,
        container:‘.page‘
    }
});

这样就可以在动态获取数据之后的回调函数中调用插件了。

Github: https://github.com/nzbin/Framework7-Indexed-List-plugin

时间: 2024-10-06 01:09:57

Framework7 索引列表插件的问题的相关文章

C# 生成随机索引列表

/// <summary> /// 生成随机索引列表 /// </summary> /// <param name="maxNumber"></param> /// <returns></returns> private static List<int> CreateRandomNumbers(int maxNumber) { var array = new int[maxNumber]; for (v

列表插件的详解

此列表插件,是用来显示后台的大数据的.比如:后台有几万条数据,需要一列一列的显示出来.但是由于是插件,所以应该能兼容各种数据的展示.有些数据的选项多,有些数据后面需要操作的按钮(操作的按钮也有可能是多个).废话不说,直接上代码. function List (options) { this.dataResoure = options.dataResoure;      //数据源,要显示的数据 this.key = options.key;                //主键; this.o

ASP.NET使用Jquery datatable列表插件

最近的项目改用bootstrap样式,表格列表也使用Jquery DataTable插件.样式挺美观的.先来张截图: 1.初始化表格插件 1 oTable = table 2 .DataTable( 3 { 4 "language": GlobalDataTablesLang, 5 "ordering": false, //开关,排序功能 是否能排序 6 "pageLength": 10, // 默认每页记录数 7 "searching

Elasticsearch学习笔记-03.2查看索引列表

使用下面的命令可以查看所有的索引: GET /_cat/indices?v 或直接在浏览器中打开连接: http://localhost:9200/_cat/indices?v 返回结果: health status index uuid pri rep docs.count docs.deleted store.size pri.store.size 表示在咱们的集群中还没有创建任何索引 本文系本人根据官方文档的翻译,能力有限.水平一般,如果对想学习Elasticsearch的朋友有帮助,将是

uni-app中页面部分内容使用索引列表(uni-indexed-list),动态数据

一.引入uni-indexed-list.uni-icons组件 从uni-app插件市场下载或从HBuilder X提供的hello uni-app模板中复制 二.页面中引用 三.对请求获得的数据处理,最终要和官方模板提供的数据结构类似,如下 3.1.模拟数据 3.2.提取数据中name字段的首字母 引入chineseConversion.js文件,js内容如下 var extract= (function () { var Pinyin = function (ops) { this.ini

带中文索引的ListView 仿微信联系人列表

由于各种原因,项目经理和产品经理把我做的东西给否定了,所以决定分享出去. 主要功能: 1 .带中文索引的ListView 2.自定义顶部搜索视图,可以对返回按钮,搜索按钮添加事件监听,带动画的咧!~ 3.底部自定义视图,可以对Listview的adapter添加监听,并且回调选中的数目,另外其他的视图都是可以自己添加的 4.右侧的索引视图,根据通讯录的解析后的数据动态生成相关索引列表 5.Adapter的抽象类,想优化自己的Adapter可以看一下,例子中的adapter仅仅是特例特写. 6.分

Android之列表索引

其实这个功能是仿苹果的,但是现在大多数Android设备都已经有了这个功能,尤其是在通讯录中最为常见.先来看看今天这个DEMO的效果图(如下图):从图中我们可以看到,屏幕中的主体是一个ListView,右边有一个导航栏,里面放着字母/数字的索引(如图1),用手指点击/移动手指可以改变选中的索引,同时ListView将滚动到选中的索引对应的第一条数据(如图2):如果ListView的数据中没有选中的索引对应的数据,则将ListView滚动到选中索引上面离选中索引最近的有数据的索引对应的第一条数据(

联系人列表字母排序索引(三)

也是忙忙碌碌好几天,今天又有时间了,继续这个文章的编写.今天是这篇文章的最后一部分.主要内容包括以下几点: 1.将中文名字转化成拼音,并提取首字母,进行排序. 2.实现分组列表Adapter模板. 3.将列表与索引结合在一起. pinyin4j是一个将中文转化成拼音的高效工具,我的源码中带了这个依赖包.通过这个工具,可以先获取一个中文的拼音. public static String getLetter(String name) { StringBuilder sb = new StringBu

列表的定义、索引、添加、删除、查找、排序

变量赋值 Python是一门弱变量的语言,它不用指定变量的类型,它的类型由值来决定. 变量赋值的方法: 1.  直接赋值 a = 1 2.  链式赋值 a = b = 1 3.  序列解包赋值 a,b = 1,2 注意:序列解包赋值变量和值的个数一定要一致 列表 列表是一个有序的.可修改的.元素以逗号分割,以中括号包围的序列. 列表定义的方法: 1.       list 2.  [] 3.  range 4.xrange 注意:在Python3中取消了xrange,但是range的效果和xra