UNPKG

landers.angular

Version:

landers.angular

148 lines (138 loc) 7.47 kB
;angular.module('Landers.angular') .directive('landersNameValueInputer', ['$timeout', 'Dialog', 'Helpers', function ($timeout, Dialog, Helpers) { var build_dialog_html = function(label_name, label_data, label_data_rows){ label_name = label_name || '名称'; label_data = label_data || '数据'; label_data_rows = label_data_rows || 2; return [ '<form class="form-horizontal">', ' <table cellpadding="0" cellspacing="0" border="0" class="stereo form-table">', ' <tr>', ' <td><label class="control-label">' + label_name + '</label></td>', ' <td><div class="control-input">', ' <input ng-model="form.name" type="text" class="form-control" ng-if="!options.names"/>', ' <select ng-model="form.name" class="form-control" ng-if="options.names">', ' <option ng-repeat="item in options.names" value="{{item}}">{{item}}</option>', ' </select>', ' </div></td>', ' </tr>', ' <tr>', ' <td><label class="control-label">' + label_data + '</label></td>', ' <td><div class="control-input"><textarea ng-model="form.value" value="" type="text" class="form-control" rows="' + label_data_rows + '"></textarea></div></td>', ' </tr>', ' </table>', '</form>' ].join('\n'); } return { restrict: 'EA', scope: { nviModel: '=' }, template: [ '<div class="relative">', ' <a ng-click="edit($event)" class="btn btn-xs btn-primary absolute right-top"><i class="glyphicon glyphicon-plus"></i></a>', '</div>', '<ul class="hlist list">', ' <li ng-repeat="item in nviModel track by $index" class="mr20 list-item">', ' <a ng-click="edit($event, $index)" class=""><span>{{item.name}}</span><span ng-hide="hideListData">:{{item.value}}</span></a>', ' <a ng-click="remove($event, $index)" class="btn btn-warning btn-xs ml5"><i class="glyphicon glyphicon-minus"></i></a>', ' </li>', '</ul>' ].join('\n'), link: function ($scope, $element, $attrs) { var label_name = $attrs['nviLabelName']; var label_data = $attrs['nviLabelData']; var label_data_rows = $attrs['nviLabelDataRows']; $scope.hideListData = $attrs['nviHideListData'] != 'false'; var dialog_width = $attrs['nviDialogWidth']; if (!isNaN(dialog_width)) dialog_width = parseInt(dialog_width); var dialog_height = $attrs['<nviD></nviD>ialogHeight']; if (!isNaN(dialog_height)) dialog_height = parseInt(dialog_height); angular.extend($scope, { form: {}, options: Helpers.attrItemToJson($attrs, 'nviOptions'), edit: function($event, item_index) { $timeout(function() { Dialog.show($scope, { title: $attrs['nviName'], content: build_dialog_html(label_name, label_data, label_data_rows), width: dialog_width || 350, height: dialog_height || 'auto', lock: true, fixed: true, effect: 'vmove1', onclose: function(){ // 清除编辑数据 $scope.form = {}; // angular_scope_apply($scope); }, onload: function () { $scope.nviModel = $scope.nviModel || []; if (item_index !== undefined) { $scope.form = angular.copy($scope.nviModel[item_index]); } }, yes: function () { var form_data = angular.copy($scope.form); var check_json_name_exists = function (json, json_index) { var index = $scope.nviModel.findIndex(function (item, item_index) { return item.name == json.name && json_index != item_index; }); return index > -1; }; // 检查数据完整性 if (!form_data.name || !form_data.name.length || !form_data.value || !form_data.value.length ) { alert('数据输入不完整'); return false; } // 检查数据重复性 if (check_json_name_exists(form_data, item_index)) { alert('【' + form_data.name + '】已经存在'); return false; } $timeout(function(){ if (isNaN(item_index)) { //添加 $scope.nviModel.push(form_data); } else { //编辑 $scope.nviModel[item_index] = form_data; } }); // angular_scope_apply($scope); }, no: true }); }, 100); }, remove: function ($event, item_index) { $timeout(function(){ $scope.nviModel.splice(item_index, 1); }); } }); $scope.$watch('nviModel', function (new_value) { if (new_value===undefined) { return; } else { //转换字符串成数组 $scope.nviModel = angular.fromJson(new_value); } }); } }; }]) .filter('landersParseNameValue', function(){ return function(json, link) { link = link || ''; var ret = []; for (var i=0; i<json.length; i++) { ret.push(json[i].name + ':' + json[i].value); } return ret.join(link); }; }) ;