详解如何将angular-ui的图片轮播组件封装成一个指令


Posted in Javascript onMay 09, 2017

在项目开发中我们经常会遇到图片轮播的功能点:

如果我们开发人员自己原生手写,将会花费很多的时间,最终得不偿失。

接下来就详细说说如何使用angular-ui发热图片轮播模块,并且将它写成一个指令(便于复用)

一如既往的我们项目中使用时requireJS进行js代码的编译

准备工作:

 1):引入angularJS , ui-bootstrap-tpls-1.3.2(我使用的是1.3.2版本的)

第一步:自己写一个指令(命名为picchange)

说明:指令控制器中的代码都是angualr-ui官网上拷贝的(因为此文章的重点是如何将其封装成指令,其他的不做重点)

指令的js代码

define(['app'],function(myapp){
  myapp.directive('picchange',[function(){
    return {
      scope:{
        picurl:'=',
      },
      controller:['$scope',function($scope){
        $scope.myInterval = 5000;//轮播的时间间隔
        $scope.noWrapSlides = false;//是否循环轮播
        $scope.active = 0;//起始所显示的图片(0:下标为0的图片)
        var slides = $scope.slides = [];//用于存放图片地址
        var currIndex = 0;
        $scope.addSlide = function() {
          var newWidth = slides.length + 1;
          slides.push({
            image: $scope.picurl[newWidth].imgUrl,//图片的url
            text: $scope.picurl[newWidth].wordDes,//图片的描述文字
            id: currIndex++
          });
        };
       //................随机...........
        $scope.randomize = function() {
          var indexes = generateIndexesArray();
          assignNewIndexesToSlides(indexes);
        };
        for (var i = 0;i<$scope.picurl.length;i++) {
          $scope.addSlide();
        }
        // Randomize logic below
        function assignNewIndexesToSlides(indexes) {
          for (var i = 0, l = slides.length; i < l; i++) {
            slides[i].id = indexes.pop();
          }
        }
        function generateIndexesArray() {
          var indexes = [];
          for (var i = 0; i < currIndex; ++i) {
            indexes[i] = i;
          }
          return shuffle(indexes);
        }
        // http://stackoverflow.com/questions/962802#962890
        function shuffle(array) {
          var tmp, current, top = array.length;
          if (top) {
            while (--top) {
              current = Math.floor(Math.random() * (top + 1));
              tmp = array[current];
              array[current] = array[top];
              array[top] = tmp;
            }
          }
          return array;
        }
      }],
      templateUrl:'js/directives/picchange/picchange.html',//轮播的页面
      link:function(s,e,attrs){
      },
    }
  }]);
});

好了上面的代码都是拷贝来的,不做解释

轮播模块的html:(picchange.html),指令的html(这个没啥理解的)

指令的html

<div>

  <div style="height: 305px;">

    <uib-carousel no-wrap="noWrapSlides" interval="myInterval" active="active">

      <uib-slide index="slide.id" ng-repeat="slide in slides track by slide.id">

        <img style="margin: auto;" ng-src="{{slide.image}}">

        <div class="carousel-caption">

          <h4>Slide {{slide.id}}</h4>

          <p>{{slide.text}}</p>

        </div>

      </uib-slide>

    </uib-carousel>

  </div>

  <div class="row">

    <div class="col-md-6">

      <button class="btn btn-info" type="button" ng-click="addSlide()">Add Slide</button>

      <button class="btn btn-info" type="button" ng-click="randomize()">Randomize slides</button>

      <div class="checkbox">

        <label>

          <input type="checkbox" ng-model="noWrapSlides">

          Disable Slide Looping

        </label>

      </div>

    </div>

    <div class="col-md-6">

      Interval, in milliseconds: <input class="form-control" type="number" ng-model="myInterval">

      <br>Enter a negative number or 0 to stop the interval.

    </div>

  </div>

</div> 

到此为止关于指令的封装已经完成,接下来是如何使用的问题:

(1)有一个页面要用到此指令:(命名为test.html)

<p>图片的轮播</p>

<div picurl="img" picchange=""></div><!--img是用来传递参数的-->

test.html对应的控制器:(idea_test_ctrl)

define(['app','directives/picchange/picchange'],function(myapp){
  myapp.controller('idea_test_ctrl',['$scope',function($scope){
    console.log("this is idea_test_ctrl 的控制器");
    $scope.img=[//img是一个对象,其中包含了图片的地址,以及文字描述
      {imgUrl:'images/test/1.jpg',wordDes:'this is good pic'},
      {imgUrl:'images/test/2.jpg',wordDes:'这是一张很好看的图片'},
      {imgUrl:'images/test/3.jpg',wordDes:'it is good pic'}
    ];

  }]);
});

这里给出我的路由配置,便于大家理解:

.state('home.ideas.test', {//(测试)

        url: '/test',

        views: {

          "part": {

            templateUrl: 'tpls/ideas/test.html',

            controller:"idea_test_ctrl"

          }

       }

 }) 

 到此已经讲解完;

ui-bootstrap的地址:http://angular-ui.github.io/bootstrap/versioned-docs/1.3.2/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
dotopAlert 提示用户需安装播放器的代码
Sep 17 Javascript
js数组Array sort方法使用深入分析
Feb 21 Javascript
JavaScript通过this变量快速找出用户选中radio按钮的方法
Mar 23 Javascript
javascript无刷新评论实现方法
May 13 Javascript
果断收藏9个Javascript代码高亮脚本
Jan 06 Javascript
jquery ztree实现模糊搜索功能
Feb 25 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
Mar 29 Javascript
原生js实现吸顶效果
Mar 13 Javascript
js实现下拉框效果(select)
Mar 28 Javascript
ES6学习教程之对象字面量详解
Oct 09 Javascript
详解如何快速配置webpack多入口脚手架
Dec 28 Javascript
jQuery实现的分页插件完整示例
May 26 jQuery
使用ES6语法重构React代码详解
May 09 #Javascript
JQuery实现定时刷新功能代码
May 09 #jQuery
React.js中常用的ES6写法总结(推荐)
May 09 #Javascript
js上传图片预览的实现方法
May 09 #Javascript
react开发中如何使用require.ensure加载es6风格的组件
May 09 #Javascript
Vue2单一事件管理组件通信
May 09 #Javascript
react-router实现按需加载
May 09 #Javascript
You might like
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
2017/07/10 PHP
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
javascript实现焦点滚动图效果 具体方法
2013/06/24 Javascript
js控制浏览器全屏示例代码
2014/02/20 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
Angular的Bootstrap(引导)和Compiler(编译)机制
2016/06/20 Javascript
jQuery实现的placeholder效果完整实例
2016/08/02 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
微信小程序分页加载的实例代码
2017/07/11 Javascript
vue生成token并保存到本地存储中
2018/07/17 Javascript
jQuery的Ajax接收java返回数据方法
2018/08/11 jQuery
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
微信小程序使用车牌号输入法的示例代码
2019/08/20 Javascript
微信小程序wxs实现吸顶效果
2020/01/08 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
使用Python程序抓取新浪在国内的所有IP的教程
2015/05/04 Python
详解Python 模拟实现生产者消费者模式的实例
2017/08/10 Python
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
django定期执行任务(实例讲解)
2017/11/03 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
python安装pil库方法及代码
2019/06/25 Python
django解决订单并发问题【推荐】
2019/07/31 Python
浅谈TensorFlow中读取图像数据的三种方式
2020/06/30 Python
六种酷炫Python运行进度条效果的实现代码
2020/07/17 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
Topshop美国官网:英国快速时尚品牌
2019/05/16 全球购物
挂靠协议书范本
2014/04/22 职场文书
大学生社会实践方案
2014/05/11 职场文书
教师岗位职责范本
2015/04/02 职场文书
婚礼双方父亲致辞
2015/07/27 职场文书
golang import自定义包方式
2021/04/29 Golang
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis