自定义Angular插件 - 网站用户引导

最近由于项目进行了较大的改版,为了让用户能够适应这次新的改版,因此在系统中引入了“用户引导”功能,对于初次进入系统的用户一些简单的使用培训training。对于大多数网站来说,这是一个很常见的功能。所以在开发这个任务之前,博主尝试将其抽象化,独立于现有系统的业务逻辑,将其封装为一个通用的插件,使得代码更容易扩展和维护。

无图无真相,先上图:

关于这款trainning插件的使用很简单,它采用了类似Angular路由一样的配置,只需要简单的配置其每一步training信息。

  • title:step的标题信息;
  • template/templateUrl: step的内容模板信息。这类可以配置html元素,或者是模板的url地址,同时templateUrl也支持Angular route一样的function语法;
  • controller: step的控制器配置;在controller中可注入如下参数:当前step – currentStep、所有step的配置 – trainnings、当前step的配置 – currentTrainning、以及下一步的操作回调 – trainningInstance(其中nextStep:为下一步的回调,cancel为取消用户引导回调);
  • controllerAs: controller的别名;
  • resolve:在controller初始化前的数据配置,同Angular路由中的resolve;
  • locals:本地变量,和resolve相似,可以传递到controller中。区别之处在于它不支持function调用,对于常量书写会比resolve更方便;
  • placement: step容器上三角箭头的显示方位,
  • position: step容器的具体显示位置,这是一个绝对坐标;可以传递{left: 100, top: 100}的绝对坐标,也可以是#stepPanelHost配置相对于此元素的placement位置。同时它也支持自定义function和注入Angular的其他组件语法。并且默认可注入:所有step配置 – trainnings,当前步骤 – step,当前step的配置 – currentTrainning,以及step容器节点 – stepPanel;
  • backdrop:是否需要显示遮罩层,默认显示,除非显示声明为false配置,则不会显示遮罩层;
  • stepClass:每一个step容器的样式信息;
  • backdropClass: 每一个遮罩层的样式信息。

了解了这些配置后,并根据特定需求定制化整个用户引导的配置信息后,我们就可以使用trainningService的trainning方法来在特定实际启动用户引导,传入参数为每一步step的配置信息。并可以注册其done或者cancel事件:

trainningService.trainning(trainningCourses.courses)
    .done(function() {
        vm.isDone = true;
    });

下面是一个演示的配置信息:

    .constant(‘trainningCourses‘, {
                courses: [{
                    title: ‘Step 1:‘,
                    templateUrl: ‘trainning-content.html‘,
                    controller: ‘StepPanelController‘,
                    controllerAs: ‘stepPanel‘,
                    placement: ‘left‘,
                    position: ‘#blogControl‘
                },{
                    title: ‘Step 3:‘,
                    templateUrl: ‘trainning-content.html‘,
                    controller: ‘StepPanelController‘,
                    controllerAs: ‘stepPanel‘,
                    placement: ‘top‘,
                    position: {
                        top: 200,
                        left: 100
                    }
                },
                    ...
                {
                    stepClass: ‘last-step‘,
                    backdropClass: ‘last-backdrop‘,
                    templateUrl: ‘trainning-content-done.html‘,
                    controller: ‘StepPanelController‘,
                    controllerAs: ‘stepPanel‘,
                    position: [‘$window‘, ‘stepPanel‘, function($window, stepPanel) {
                        // 自定义函数,使其屏幕居中
                        var win = angular.element($window);
                        return {
                            top: (win.height() - stepPanel.height()) / 2,
                            left: (win.width() - stepPanel.width()) / 2
                        }
                    }]
                }]
            })

本文插件源码和演示效果唯一codepen上,效果如下:

See the Pen ng-trainning by green (@greengerong) on CodePen.

在trainning插件的源码设计中,包含如下几个要点:

  • 提供service api。因为关于trainning这个插件,它是一个全局的插件,正好在Angular中所有的service也是单例的,所以将用户引导逻辑封装到Angular的service中是一个不错的设计。但对于trainning的每一步展示内容信息则是DOM操作,在Angular的处理中它不该存在于service中,最佳的方式是应该把他封装到Directive中。所以这里采用Directive的定义,并在service中compile,然后append到body中。
  • 对于每一个这类独立的插件应该封装一个独立的scope,这样便于在后续的销毁,以及不会与现有的scope变量的冲突。
  • $q对延时触发的结果包装。对于像该trainning插件或者modal这类操作结果采用promise的封装,是一个不错的选择。它取代了回调参数的复杂性,并以流畅API的方式展现,更利于代码的可读性。同时也能与其他Angular service统一返回API。
  • 对于controller、controllerAs、resolve、template、templateUrl这类类似路由的处理代码,完全可以移到到你的同类插件中去。它们可以增加插件的更多定制化扩展。关于这部分代码的解释,博主将会在后续文章中为大家推送。
  • 利用$injector.invoke动态注入和调用Angular service,这样既能获取Angular其他service注入的扩展性,也能获取到函数的动态性。如上例中的屏幕居中的自定义扩展方式。

这类设计要点,同样可以运用到想modal、alert、overload这类全局插件中。有兴趣的读者,你可以在博主的codepen笔记中阅读这段代码http://codepen.io/greengerong/pen/pjwXQW#0

时间: 2024-10-14 08:19:38

自定义Angular插件 - 网站用户引导的相关文章

BlueDream.js(蓝梦)——jQuery网站使用引导插件

小菜在前端世界游荡有些时间了,常见的插件多少有些了解,但却很少看到用户引导插件. 所谓用户引导插件,就是在第一次使用某个网站时,会弹出一些小动画,告诉你网站的基本使用方法,帮你快速入门. 这应该是个常见的功能,做成插件也不是什么难事,既然现在还比较少,那小菜就写一个吧! 于是BlueDream.js诞生了...因为此插件的设计色调为蓝色,因此起名"蓝梦". 简介: BlueDream.js是一款用户引导插件,可以让您的网站更容易入门. BlueDream.js依赖jQuery,因此自身

使用HTML5、CSS3和jQuery增强网站用户体验[留存]

记得几年前如果你需要添加一些互动元素到你的网站中用来改善用户体验?是不是立刻就想到了flash实现?这彷佛年代久远的事了.使用现在最流行的Web技术HTML5,CSS3和jQuery,同样也可以实现类似的用户体验.而且使用这些特性将会比使用flash更加有效.也许你可能刚知道Adobe停止开发移动版flash的消息,虽然在桌面中我们还拥有大量的flash的应用,但是随着HTML标准的完善,可能flash也要退出历史舞台了.在今天这篇文章中,我们将介绍一些非常实用的教程,技巧和资源来帮助大家构建一

微信公众号用户与网站用户的绑定(一)

绑定:对于同一个用户,我们如何建立微信公众号用户(openid)与网站用户(userid)之间的对应关系. 一次完整的绑定流程应该是这样的: ①用户登录网页,点击"绑定微信账户":②后台使用微信接口,生成二维码链接返回给前端显示,并建立场景值A与用户的对应关系:③用户扫描二维码,并点击关注微信公众号(假如已关注,直接跳到④):④后台接收微信服务器推送的场景值A:⑤后台根据场景值A,查询到对应的用户ID(依赖于②中建立的对应关系):⑥建立用户userid与微信用户openid的对应关系:

【分分钟上手weiphp插件开发】Vol.1——第一个自定义weiphp插件:MyHello

我们都知道,学习任何一门编程语言,一般来说第一个范例程序就是输出“Hello World”.从今天开始我们来学习weiphp插件开发,也从一个HelloWorld级别的插件开始讲起,因为安装好了的weiphp框架,默认安装了weiphp官方开发的HelloWorld插件,所以这里为了防止跟官方的插件冲突,我们开发的第一个自定义weiphp插件取名为MyHello,并通过这个简单的插件来讲解weiphp插件开发的整个流程.整个[分分钟上手weiphp插件开发]系列教程都是直接从创建一个新的插件开始

手机产品设计之用户引导

在手机产品的设计过程中,由于手机界面的承载能力有限,产品功能的不断膨胀,必须要在用户打开应用之后告知他某些新奇的功能,引导他完成某些主要任 务流程,让用户不至于迷失在陌生应用中不知所措.帮助用户快速掌握应用的使用方法,体验到应用的乐趣,新手引导成了一个必须考虑的设计环节. 用户引导的直接目标是帮助用户更好的使用产品,终极目标是提升用户满意度.虽然,大多数情况下,我们可以通过合理的设计,尽可能的简化功能,让用户 无需引导和帮助,就可以完成必要的任务.但是实际上,手机产品的限制和对强大功能的追求,导

iOS使用Object-C自定义cordova插件(-)

1.  创建项目 打开终端,切换到桌面,然后使用`ionic`创建一个测试项目,命名CountTest. cd ./Desktop/ sudo ionic start CountDemo 或 //使用cordova ,但是后期cordova不知道怎么引导ionic中,如果你知道请留言告诉我,感谢!        sudo cordova create CountDemo com.twenty.CountDemo CountDemo 1: 项目创建到桌面的目录名, 2: iOS Bundle Id

Android实现用户引导界面

在众多应用中,几乎每一款应用都有自己的Splash用户引导界面,该界面在用户首次启动展示,之后不会显示,主要向用户展示新功能. 分析 主要使用ViewPager+Indicator实现 主要是实现一个圆形指示器,这个圆形指示器继承LinearLayout,需要有一些属性可以自定义,比如指示器的颜色,大小,边距等 这个指示器也可以自动滚动,比如应用在幻灯片展示的地方 指示器是圆形的,需要我们自己绘制 这个圆形指示器实现了ViewPager.OnPageChangeListener接口 实现 定义自

提高网站用户体验的4个方面

很多朋友都会说,建设网站的目的就是为了让网站带来流量,就是让用户访问,就是让企业盈利.这些一点都不错,但是对于搜索引擎优化越来越难做,用户体验要求越来越高,成本控制越来越低,网站投入扎堆的大环境下,我们如何让网站脱颖而出? 在这里,笔者认为:做好用户体验,流量自然会到来. 所谓网站用户体验,其实就是:个人浏览习惯.网站操作习惯,搜索引擎搜索习惯.网络交流习惯等互联网相关习惯的结合. 那么一个网站如何做到上述习惯的结合? 第一点:行业分析.要做一个合格的网站不能不对行业进行整合分析,这里说的是合格

关于nagios系统下使用shell脚本自定义监控插件的编写以及没有实时监控图的问题

关于nagios系统下shell自定义监控插件的编写.脚本规范以及没有实时监控图的问题的解决办法 在自已编写监控插件之前我们首先需要对nagios监控原理有一定的了解 Nagios的功能是监控服务和主机,但是他自身并不包括这部分功能,所有的监控.检测功能都是通过各种插件来完成的. 启动Nagios后,它会周期性的自动调用插件去检测服务器状态,同时Nagios会维持一个队列,所有插件返回来的状态信息都进入队列, Nagios每次都从队首开始读取信息,并进行处理后,把状态结果通过web显示出来. N