详解如何将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 动态选中下拉框
Nov 26 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
May 30 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
Feb 18 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
Jul 05 Javascript
Node.JS文件系统解析实例详解
May 15 Javascript
彻底解决 webpack 打包文件体积过大问题
Jul 07 Javascript
JavaScript hasOwnProperty() 函数实例详解
Aug 04 Javascript
jQuery实现滚动效果
Nov 17 jQuery
React数据传递之组件内部通信的方法
Dec 31 Javascript
vue slot 在子组件中显示父组件传递的模板
Mar 02 Javascript
Vue使用localStorage存储数据的方法
May 27 Javascript
在vue中利用v-html按分号将文本换行的例子
Nov 14 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
动画 《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
php数组合并的二种方法
2014/03/21 PHP
PHP实现PDO的mysql数据库操作类
2014/12/12 PHP
php操作mongoDB实例分析
2014/12/29 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
Jquery iframe内部出滚动条
2010/02/11 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
jquery获取复选框被选中的值
2014/04/10 Javascript
自己动手手写jQuery插件总结
2015/01/20 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
2015/09/16 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
jsonp跨域及实现百度首页联想功能的方法
2018/08/30 Javascript
vue+SSM实现验证码功能
2018/12/07 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
聊聊Vue中provide/inject的应用详解
2019/11/10 Javascript
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
用Python登录Gmail并发送Gmail邮件的教程
2015/04/17 Python
Python使用matplotlib实现绘制自定义图形功能示例
2018/01/18 Python
Django 框架模型操作入门教程
2019/11/05 Python
keras slice layer 层实现方式
2020/06/11 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
大学生实习感言
2014/01/16 职场文书
2014年机关植树节活动方案
2014/02/27 职场文书
十佳少先队员演讲稿
2014/09/12 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
西双版纳导游词
2015/02/03 职场文书
毕业生对母校寄语
2015/02/26 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP
Android 中的类文件和类加载器详情
2022/06/05 Java/Android