详解如何将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 相关文章推荐
JS仿iGoogle自定义首页模块拖拽特效的方法
Feb 13 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
Feb 19 Javascript
jQuery实现HTML表格单元格的合并功能
Apr 06 Javascript
jquery中的常见问题及快速解决方法小结
Jun 14 Javascript
深入理解React中es6创建组件this的方法
Aug 29 Javascript
CSS3 3D 技术手把手教你玩转
Sep 02 Javascript
自制微信公众号一键排版工具
Sep 22 Javascript
Node.js查找当前目录下文件夹实例代码
Mar 07 Javascript
Vue中fragment.js使用方法详解
Mar 09 Javascript
详解基于vue-cli优化的webpack配置
Nov 06 Javascript
jQuery 防止相同的事件快速重复触发方法
Feb 08 jQuery
微信小程序中悬浮窗功能的实现代码
Aug 02 Javascript
使用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中日期加减法运算实现代码
2011/12/08 PHP
神盾加密解密教程(三)PHP 神盾解密工具
2014/06/08 PHP
9个经典的PHP代码片段分享
2014/12/18 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
mysql输出数据赋给js变量报unterminated string literal错误原因
2010/05/22 Javascript
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
javascript计算用户打开网页的停留时间
2014/01/09 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
2020/10/18 Javascript
python文件读写并使用mysql批量插入示例分享(python操作mysql)
2014/02/17 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
python 实现图片旋转 上下左右 180度旋转的示例
2019/01/24 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
keras的load_model实现加载含有参数的自定义模型
2020/06/22 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
四年级科学教学反思
2014/02/10 职场文书
理财学专业自荐书
2014/06/28 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
群众路线个人自我剖析材料
2014/10/07 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书
python 字典和列表嵌套用法详解
2021/06/29 Python
Python进行区间取值案例讲解
2021/08/02 Python
使用CSS3实现按钮悬停闪烁动态特效代码
2021/08/30 HTML / CSS
Promise静态四兄弟实现示例详解
2022/07/07 Javascript
app场景下uniapp的扫码记录
2022/07/23 Java/Android