自己写的angularJs排序指令【原创】
首先,给大家看看指令完成的效果。(请注意区分下面几张图片中,对象值的变化)
  
   
好了,效果图已经看完了,如果大家有兴趣的话可以继续往下看,接下来要讲的是关于angularJs中filter内置好的order功能,如果熟悉这个功能的同学们可以跳过下面要讲的内容
orderBy这个功能其实是内置的过滤器,他可以在html和js代码中使用
    html:{{ orderBy_expression | orderBy : expression : reverse}}
    js    :$filter('orderBy')(array, expression, reverse)
在这里我们只看html标签的运用,可以看出来他需要传入三个值
1.orderBy_expression :你需要排序的数组
2.expression :你需要根据哪个条件排序
3.reverse :正序还是倒序(boolean)
看到这里可能有的同学就知道为什么我要创建效果图中的这样的{"orderPredicate":"price","orderReverse":false}对象了。
由于这里不是详细讲过滤的所以想深入理解的话 登录官方的API吧 : http://docs.angularjs.cn/api/ng/filter/orderBy
现在开始进入主要内容了,首先我们要讲的是指令,不废话先上代码在分析
js:
angular.module('MyApp',[])
        .controller('MyCtrl',function(){
            var vm = this;
            //排序条件的数组
            vm.orderList = [{
                "title" : "价格",
                "value" : "price"
            },{
                "title" : "数量",
                "value" : "count"
            }]
            //排序条件对象
            vm.orderInfo = {
                orderPredicate : "",//排序的值
                orderReverse : false//正反序
            }
        })
        .directive('orderList', function() {
        return {
            controller: function($scope, $element, $attrs, $transclude) {
                var lists = [];//排序条件的列表
                this.getOpened = function(selectedItem) {
                    //控制只能点击一个排序条件
                    angular.forEach(lists, function(item, key) {
                        if (selectedItem != item) {
                            item.showMe = false;
                        }
                    });
                }
                //提供方法,在item生成的时候,将值放入lists中
                this.addItem = function(item) {
                    lists.push(item);
                }
            },
            restrict: 'AE',
            template: '<ul class="list-group" ng-transclude></ul>',
            replace: true,
            transclude: true,
            link: function($scope, iElm, iAttrs, controller) {}
        };
    })
    .directive('orderListItem', function() {
        return {
            scope: {
                orderVaule: '=',//即将排序数组中的排序条件
                orderReverse: '=',//排序条件的值
                orderPredicate: '=',//控制排序的正序或倒序
                iconUp: '@',//升序图标
                iconDown: '@',//降序图标
            },
            controller: function($scope, $element, $attrs, $transclude) {},
            require: '?^orderList',//'^'判断是否存在父容器oederList,'?'可以避免orderList不存在的时候不报错
            restrict: 'AE',
            template: '<li class="list-group-item" ng-click="toogle(orderVaule)">' +
                '<span ng-transclude></span>' +
                '<i ng-show="showMe" class="glyphicon pull-right" ng-class="{true:\'{{iconUp}}\',false:\'{{iconDown}}\'}[orderReverse]"></i>' +
                '</li>',
            transclude: true,
            link: function($scope, iElm, iAttrs, controller) {
                //item渲染刚开始所有的图标都不显示
                $scope.showMe = false;
                //讲渲染的item加入父容器的lists中
                controller.addItem($scope);
                //点击item事件
                $scope.toogle = function(value) {
                    //正反序切换
                    $scope.orderReverse = !$scope.orderReverse;
                    //将值赋予排序条件
                    $scope.orderPredicate = value;
                    //并显示图标
                    $scope.showMe = true;
                    //关闭其他item的图标
                    controller.getOpened($scope);
                }
            }
        };
    })
html:
<body ng-controller="MyCtrl as vm">
<order-list>
<order-list-item ng-repeat="item in vm.orderList" icon-up="glyphicon-arrow-up" icon-down="glyphicon-arrow-down" order-vaule="item.value" order-reverse="vm.orderInfo.orderReverse" order-predicate="vm.orderInfo.orderPredicate">
{{item.title}}
</order-list-item>
</order-list>
{{vm.orderInfo}}
</body>
可能有些同学疑惑 ng-controller="MyCtrl as vm" 这是什么意思,其实这是angularJs推荐的写法,为了避免与$scope的原型继承搞混。毕竟全部都是$scope也不太美观,实际上是这样的 var vm =$scope.vm = {}
大部分的讲解都在注释上了,如果有问题的可以在下方提问;另外这里的图标是不支持图片的,只支持图标,需要引入bootstrap.css和里面的图标功能。
自己写的angularJs排序指令【原创】的更多相关文章
- AngularJS之指令
		
紧接上篇博客“初探AngularJS” 一.前言 在AngularJS中指令尤为重要且内容庞多,固单独提炼出来,梳理一番.如有错误,请不吝讲解. 好了,言归正传,让我们一起走进Angular指令的世界 ...
 - 《AngularJS》--指令的相互调用
		
转载自http://blog.csdn.net/zhoukun1008/article/details/51296692 人们喜欢AngularJS,因为他很有特色,其中他的指令和双向数据绑定很吸引着 ...
 - 学习AngularJs:Directive指令用法(完整版)
		
这篇文章主要学习AngularJs:Directive指令用法,内容很全面,感兴趣的小伙伴们可以参考一下 本教程使用AngularJs版本:1.5.3 AngularJs GitHub: http ...
 - AngularJs:Directive指令用法
		
摘自:http://www.jb51.net/article/83051.htm 摘要:Directive(指令)是AngularJ非常强大而有有用的功能之一.它就相当于为我们写了公共的自定义DOM元 ...
 - angularJs 自定义指令传值---父级与子级之间的通信
		
angularJs自定义指令用法我忽略,之前有写过,这里只说一下父子级之间如何传值: 例如: 模块我定义为myApp,index.html定义 <my-html bol-val="bo ...
 - 带你走近AngularJS - 体验指令实例
		
带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...
 - AngularJs自定义指令详解(2) - template
		
一些用于定义行为的指令,可能不需要使用template参数. 当指定template参数时,其值可以是一个字符串,表示一段HTML文本,也可以是一个函数,这函数接受两个参数:tElement和tAtt ...
 - AngularJs自定义指令详解(1) - restrict
		
下面所有例子都使用angular-1.3.16.下载地址:http://cdn.bootcss.com/angular.js/1.3.16/angular.min.js 既然AngularJs快要发布 ...
 - angularJS自定义指令间的“沟通”
		
由此例子我们可以看出,angularJS使用指令时link的执行顺序<html> <head> <meta charset="utf-8"/> ...
 
随机推荐
- 笔记整理--Linux_Socket
			
揭开Socket编程的面纱 - 博客 - 伯乐在线 - Google Chrome (2013/9/22 19:28:24) 揭开Socket编程的面纱 2013/09/21 | 分类: IT技术 | ...
 - win7系统,apache2.2下添加PHP5的配置详解
			
首先要说apache(服务器). php(开发语言). mysql(数据库) 之间的关系. Apache:为系统提供了Web服务支持,网站:http://www.apache.org/ PHP:为系统 ...
 - 图像相似度计算之哈希值方法OpenCV实现
			
http://blog.csdn.net/fengbingchun/article/details/42153261 图像相似度计算之哈希值方法OpenCV实现 2014-12-25 21:27 29 ...
 - hdu_5753_Permutation Bo(找规律)
			
题目连接:hdu_5753_Permutation Bo 题意: 给你一个有n个数的数列c1~cn,h1~hn为1~n的排列,求ci[hi>hi-1 and hi>hi+1]的期望和. ...
 - 解决mac下atom安装插件失败问题
			
activate-power-mode的超炫编辑效果打动了我,花时间安装了atom,之后在package,install里面找到了这个插件,但是安装失败,如下图所示: gyp info it work ...
 - 我的C笔记
			
最近更新: 1,父进程fork一个子进程,当向父进程发送一个SIGINT或其它信号时,子进程是否会接受到该信号? 2,父进程调用system执行一个程序时,向父进程发送一个信号时,system运行中的 ...
 - java 集合中将元素倒序排列
			
方法一:实现Comparable接口排序package collsort.comparable; package com.cvicse.sort.comparable; public class Ca ...
 - JavaScript 伪造 Referer 来路方法
			
Javascript 是一种由Netscape的LiveScript发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题, ...
 - 开始制作国产的 scratch
			
首先分析下API和数据格式: https://api.scratch.mit.edu/proxy/featured GET 23.235.37.162:443 返回数据与对应栏目: commun ...
 - wifi的UI控制。打不开UI
			
部分主要是您要清楚WiFi作为什么功能,即WiFi是仅仅作为station功能,还是要开启p2p功能,当WiFi作为station功能时候开启的是wpa_supplicant服务,当WiFi作为p2p ...