backman
Version:
基于Angluar与bootstrap进行后台管理系统快速搭建的前端框架
158 lines (148 loc) • 6.66 kB
JavaScript
/*
* author:tank
* date:2016-12-12
* desc:component select2
*/
backman.directive('bmSelect2', function($timeout){
'use strict';
return {
scope: {
bindList:'=', // 列表中的数据集
bindSearch:'@', // 搜索哪个字段
bindData:'=' // 统一返回数组
},
restrict: 'A',
template: '<div class="bm-select2-box" ng-click="$event.stopPropagation();">' +
'<input type="text" class="bm-select2-input" ng-model="name">' +
'<ul class="bm-select2-list list-unstyled">' +
'<li ng-if="isShowCheckbox">' +
'<label style="margin: 0;">'+
'<input type="checkbox" ng-checked="checkedAll" ng-click="act.doCheckAll(filtoutData);"/>' +
'<span>全选</span>' +
'</label>' +
'</li>' +
'<li ng-repeat="item in filtoutData">' +
'<label style="margin: 0;" ng-if="!isShowCheckbox" ng-click="act.doClick(item);" ng-bind="item[bindSearch]"></label>' +
'<label style="margin: 0;" ng-if="isShowCheckbox">'+
'<input type="checkbox" ng-checked="item.checked" ng-click="act.doClick(item);"/>' +
'<span ng-bind="item[bindSearch]"></span>' +
'</label>' +
'</li>' +
'</ul> ' +
'</div>',
replace: true,
link: function($scope, iElm, iAttrs, ctrl) {
var doc = $(document),
input = iElm.children('input'),
ul = iElm.children('ul');
// 控件行为
input.click(function(e) {
var hideUl = function() {
ul.hide();
doc.off('click', hideUl);
};
var isUlShow = ul.css('display') != 'none';
if(isUlShow) {
ul.hide();
doc.off('click', hideUl);
}else {
ul.show();
doc.on('click', hideUl);
}
});
// 筛选用函数
var filterFn = function(key, data) {
var searchin = $scope.bindSearch;
var result = [];
if(key && data && data.length) {
angular.forEach(data, function(v, k, obj) {
if(v[searchin].indexOf(key) >= 0) {
result.push(v);
}
});
}
return result;
};
// 模板中用到的模型
$scope.bindListCopy = []; // 拷贝出来的数据源
$scope.filtoutData = []; // 过滤出来的数据(展示用)
$scope.name = ''; // input输入框的模型
$scope.isShowCheckbox = parseInt(iAttrs.isShowCheckbox, 10) === 1 ? true : false ; // 是否显示复选框
$scope.checkedAll = false; // 是否全选
$scope.bindData = []; // 返回控制器的结果集
// arr就是结果集合$scope.bindData
var toggleSelectedItem = function(arr, it) {
var idx = arr.indexOf(it);
if(it.checked) {
if(idx < 0) {
arr.push(it);
}
} else {
if(idx >= 0) {
arr.splice(idx, 1);
}
}
return arr;
};
$scope.act = {
doClick:function(item) {
if($scope.isShowCheckbox) { // 多选的情况
item.checked = !item.checked;
$scope.bindData = toggleSelectedItem($scope.bindData, item);
} else { // 单选的情况
$scope.name = item[$scope.bindSearch];
$scope.bindData = [item];
// 写这里貌似不太好
ul.hide();
}
},
doCheckAll:function(allItems) {
if($scope.isShowCheckbox) { // 多选的情况
$scope.checkedAll = !$scope.checkedAll;
angular.forEach(allItems, function(v, k) {
v.checked = $scope.checkedAll;
toggleSelectedItem($scope.bindData, v);
});
}
}
};
// 如果绑定的数据源改变了,则重新初始化一些值
$scope.$watch('bindList', function(newVal, oldVal) {
var dataPreHandler = function(dt) {
if(dt && dt.length) {
angular.forEach(dt, function(v, k) {
v.checked = false;
});
}
return dt;
};
if(newVal) {
$scope.bindListCopy = dataPreHandler(angular.copy($scope.bindList));
$scope.filtoutData = [].concat($scope.bindListCopy);
$scope.name = '';
$scope.bindData = [];
if ($scope.isShowCheckbox) {
$scope.checkedAll = false;
}
}
});
// 函数节流,减少筛选的次数
var timeObj = null;
$scope.$watch('name', function(newVal, oldVal) {
if(timeObj){
$timeout.cancel(timeObj);
}
timeObj = $timeout(function(){
var search = $.trim(newVal)?$.trim(newVal):'';
if(search) {
$scope.filtoutData = filterFn(search ,$scope.bindListCopy);
}else {
$scope.filtoutData = [].concat($scope.bindListCopy);
}
$scope.checkedAll = false;
timeObj = null;
}, 500);
});
}
};
});