Angular----安置物流项目前端框架经验总结
一、架构方面
(一) Angular框架有service 、controller层:
在Angular里面,services作为单例对象在需要到的时候被创建,只有在应用生命周期结束的时候(关闭浏览器)才会被清除。而controllers在不需要的时候就会被销毁了(因为service的底层机制是通过闭包实现,如果过分使用会导致内存泄露从而导致性能问题)。
(二)Angular框架技术方面
1、angular.ui.grid 数据表的技术
基本结构的案例代码:
HTML页面:
//没有分页的情况
<div ui-grid="financialMainOption" ui-grid-selection ui-grid-pinning ui-grid-resize-columns
style="height:399px;" class="grid">
</div> //分页的情况
<div ui-grid="gridOptionsJobCostTemplate" ui-grid-pagination
ui-grid-selection ui-grid-resize-columns ui-grid-exporter class="grid"
style="height: 550px;">
</div> /*分页的模块标志*/
ui-grid-pagination
JS页面:
$scope.rateIncomeOptions = {
            enablePagination : true,// 是否禁用分页
            useExternalPagination : true,// 必须设为true才能赋值totalItems
            enableRowSelection : true,
            enableSelectAll : true,
            enableSorting: true,
            enableCellEditOnFocus:true,//单元格指令
            enableRowSelection:false,
            columnDefs : [
                {name : "rateNme",displayName : '费率名称' ,width : "",enableCellEdit : false,cellClass:cellRateRow,cellTemplate:'<div class="rateOption_{{row.entity.rateUuid}}">{{row.entity.rateNme}}</div>'},
                {name : "money",displayName : '实际金额' ,width : "",type:'number',enableCellEdit : true,cellClass: cellClassOrderFun},
                {name : 'unit',displayName : '单位' ,width : "",type:'number',enableCellEdit : false,cellFilter:"rateUnitFilter"},
                {name : "taxThan",displayName : '纳税比' ,width : "",type:'number',enableCellEdit : true},
                {name : 'remarks',displayName :'费用备注',width : "",enableCellEdit : true},
                {name : 'settlementStatus',displayName : '审核状态',width : "",cellFilter : 'settlementStatus',enableCellEdit : false},
                {name : 'isHaveTicket',displayName :'票',width : "",enableCellEdit : false,cellFilter:"isOneOrZeroFilter"},
                {name : 'serialNo',displayName :'序号',type:'number',width : "",enableCellEdit : true ,sort: { direction: uiGridConstants.ASC, priority:  } },
                ]};
    // 将grid的API绑定到scope作用域
    $scope.rateIncomeOptions.onRegisterApi = function(gridApi) {
        $scope.rateIncomeGridApi = gridApi;
        //点击行头触发
        gridApi.selection.on.rowSelectionChangedBatch($scope, function (row, event) {/*row选择行头时,event触发该事件的源事件*/
             $scope.selectRateIncomeDatas=gridApi.selection.getSelectedGridRows();//所有选中的行
             $scope.sumInAmount =  $scope.caluSumMoney($scope.selectRateIncomeDatas); //计算选中行的总金额
        });
         //点击行时触发
        gridApi.selection.on.rowSelectionChanged($scope, function (row, event) {/*row选择的行,event触发该事件的源事件*/
             $scope.selectRateIncomeDatas=gridApi.selection.getSelectedGridRows();//所有选中的行
             $scope.sumInAmount =  $scope.caluSumMoney( $scope.selectRateIncomeDatas); //计算选中行的总金额
        });
        //单元格进入事件
        gridApi.edit.on.beginCellEdit($scope,function(row,column){
            $scope.oldValue = row[column.name];
        });
        //编辑单元格离开的事件
        gridApi.edit.on.afterCellEdit($scope,function(row,column){
            //当值发生变化时修改
            if($scope.oldValue!=row[column.name]){
            }
        });
    };
注意点:
(1)Excel导出,中文不乱码的设置,添加属性: 例如:
exporterCsvFilename:"运单报表"+new Date().getTime()+".csv",
exporterOlderExcelCompatibility:true, //不使用UTF-8编码
(2)其中Grid中的列属性columnDefs 可以动态加载,例如:
statisticsReportService.buildWayBillReportColumns().success(
function(columns) {
hideLoading();
$scope.wayBillReportGrid.columnDefs = columns; //动态的赋值给列属性
//动态绑定行颜色
$.each(columns,function(i,column){
column.cellClass = cellClassJobFun;
});
$scope.wayBillReportStatistical();
});
(3)清除已选中的行,操作方法,如下:
//设置选中的行为0
$scope.rateIncomeGridApi.selection.clearSelectedRows();
(4)
2、angular.ui.tree 树形tree技术
HTML页面代码:【控制菜单的收缩性】
<div ui-tree="treeOptions" id="tree-root">
<ol ui-tree-nodes="" ng-model="subjectTreeList">
<li ng-repeat="node in subjectTreeList" ui-tree-node ng-include="'nodes_renderer.html'" ng-show="visible(node)"></li>
</ol>
</div> <!--子模板部分-->
<script type="text/ng-template" id="nodes_renderer.html">
<div ui-tree-handle class="tree-node tree-node-content">
<a class="btn btn-success btn-xs" ng-if="node.childSubjectSize && node.childSubjectSize > 0" data-nodrag ng-click="toggle(this)">
<span class="glyphicon"
ng-class="{'glyphicon-chevron-right': collapsed, 'glyphicon-chevron-down': !collapsed}">
</span>
</a>
<span ng-if="node.subjectAlias">{{node.subjectCode}} : {{node.subjectAlias}}</span>
<span ng-if="!node.subjectAlias">{{node.subjectCode}} : {{node.subjectName}}</span>
<span>
<a ng-show="node.subjectGrade>-1" class="pull-right btn btn-danger btn-xs" data-nodrag ng-click="removeSubItem(this)"><span
class="glyphicon glyphicon-remove"></span></a>
<a class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="newSubItem(this)" style="margin-right: 8px;"><span
class="glyphicon glyphicon-plus"></span></a>
<a ng-show="node.subjectGrade>-1" class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="editSubItem(this)" style="margin-right: 8px;"><span
class="glyphicon glyphicon-edit"></span></a>
</span>
</div>
<ol ui-tree-nodes="" ng-model="node.childFinanceSubjects" ng-class="{hidden: collapsed}" style="padding-left:29px;">
<li ng-show="node.collapsed" ng-repeat="node in node.childFinanceSubjects" ui-tree-node ng-include="'nodes_renderer.html'" ng-show="visible(node)">
</li> <li ng-show="!node.collapsed" ng-repeat="node in node.childFinanceSubjects" ui-tree-node data-collapsed="true" data-expand-on-hover="true" ng-include="'nodes_renderer.html'" ng-show="visible(node)">
</li>
</ol>
</script>
JS代码部分:
数据源:
$scope.getTreeList=function(){
        loadingPage();
        financeSubjectService.findAllFinanSubject2($scope.form).success(function(data){
            $scope.allData=data.result;
            //查询树
            $scope.subjectTreeList=[];
            var subjectList=[];
            if(data.result["-1"] && data.result["-1"].length>){
                $.each(data.result["-1"],function(j,obj){
                    //$scope.initSortNode(obj);
                    subjectList.push(obj);
                });
            }
            var nodeList=$scope.sortNode(subjectList);
            //创建根节点
            var root={};
            root.subjectName="财务科目";
            root.subjectGrade=-;
            root.subjectCode='';
            root.subjectType='PAYINCOME';
            root.childSubjectSize=nodeList.length;
            root.childFinanceSubjects=nodeList;  
            $scope.subjectTreeList.push(root);
            $scope.treeOptions.data=$scope.subjectTreeList;
            hideLoading();
        });
    };
tree结构的控制:
 $scope.treeOptions = {
   //回调函数
   beforeDrop : function (e) {//拖曳节点下降时候调用的函数
   },
   accept: function(sourceNodeScope, destNodesScope, destIndex) {
       return true;
   },
   removed:function(node){
   },
   dropped:function(event){
   },
   dragStart:function(event){
   },
   dragMove:function(event){
   },
   dragStop:function(event){
   },
   beforeDrag:function(sourceNodeScope){ //拖曳之前检查节点
   },
   toggle:function(collapsed, sourceNodeScope){
       if(!collapsed && sourceNodeScope.$modelValue.financeSubjectUuid){
           loadingPage();
           if($scope.allData){
               sourceNodeScope.$modelValue.childFinanceSubjects=$scope.sortNode($scope.allData[sourceNodeScope.$modelValue.financeSubjectUuid]);
               hideLoading();
           }
       }
   }
 };
 
注意点: 可以在toggle中控制节点的延迟加载。
Angular----安置物流项目前端框架经验总结的更多相关文章
- 前端框架 EasyUI (0) 重新温习(序言)
		几年前,参与过一个项目.那算是一个小型的信息管理系统,BS 结构的,前端用的是基于 jQuery 的 EasyUI 框架. 我进 Team 的时候,项目已经进入开发阶段半个多月了.听说整个项目的框架是 ... 
- 前端框架之争丨除了Vue、Angular和React还有谁与之争锋
		转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://www.sitepoint.com/most-popular-frontend-f ... 
- 如何选择前端框架:ANGULAR VS EMBER VS REACT
		最近一段时间是令前端工程师们非常兴奋的时期,因为三大Web框架陆续发布新版本,让我们见识到了更强大的Web框架.Ember2.0在2个月之前已经发布,从1.0升级到2.0非常简单.几周之前React发 ... 
- 为SpringMvc项目安装BootStrap和AngularJs前端框架
		在我们"用SpringMVC写一个注册的小Demo"之前,我们学习一下如何给该项目安装Bootstrap和AngularJs的前端框架,这样我们就能轻松排版出漂亮的登录界面.我们采 ... 
- b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释
		继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更新页面显示状态这种方式在运作的,从若干年前简单的ajax流行起来 ... 
- 前端框架Angular、react、vue在github上的数据统计-2018-05
		2018年5月31日09:15:45 突然想看看几个前端框架的数量,然后就截图了如下数据: 分析: react关注.收藏.Fork都高vue一些, 但相差不大 angular比较奇葩,收藏只有二者一半 ... 
- 【转】前端框架天下三分:Angular React 和 Vue的比较
		前端框架天下三分:Angular React 和 Vue的比较 原文链接:http://blog.csdn.net/haoshidai/article/details/52346865 前端这几年的技 ... 
- springmvc项目搭建三-添加前端框架
		这几年前端框架发展可以说非常迅猛了...实际项目中也用到了几个,easyui相对来讲,算是我第一个接触的前端框架了,用的时候感觉很方便,省了很多代码量,一个好的前端框架可以为你省去很多精力在前端布局上 ... 
- day97:MoFang:移动端APP开发准备&移动端项目搭建&APICloud前端框架
		目录 1.移动端开发相关概念 1.APP类型 2.移动端屏幕介绍 3.移动端自适配方案 4.元信息(meta) 2.APP开发准备 1.注册APPCLoud账号 2.下载APP开发编辑器 3.下载AP ... 
随机推荐
- 执行Java脚本firefox启动成功,不运行test方法,且提示NullPointerException
			在ideal中新建maven项目,将录制好的Java脚本文件,直接复制到项目中,添加相关的依赖脚本. 代码不报错之后,运行录制好的Java脚本,启动了firefox之后,不执行test方法,报错Nul ... 
- Linux-vim与ssh客户端
			一.vim使用 Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文本编辑器. (1)vim安装 (2)vim使用:操作模式 一般模式(默认模式,不 ... 
- django【F和Q】
			一.F 案例每人增加500工资 ORM:UserInfo.objects.filter().update(salary=500) 这不行吧 SQL: update userinfo set salar ... 
- Python(异常处理)
			一 错误和异常 程序中难免出现错误,而错误分成两种 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) 2.逻辑错误(逻辑错误) 什么是异常 异常就是程序运行时发 ... 
- 启动secondarynamenode时报错
			环境: mac系统 + hadoop2.6.0-cdh5.7.0伪分布式 问题一: 在启动hdfs的secondarynamenode时,报错. 正常情况: sumengdeMacBook-Pro: ... 
- 97. Interleaving String(字符串的交替连接  动态规划)
			Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given:s1 = ... 
- javascript 设置元素滚动大小
			3. 滚动大小 最后要介绍的是滚动大小(scroll dimension),指的是包含滚动内容的元素的大小. 有些元素(例如 元素),即使没有执行任何代码也能自动地添加滚动条:但另外一些元素,则需要通 ... 
- Method Swizzling 剖析
			一.背景介绍 关于Method Swizzling的文章一大堆,讲的非常好的也数不胜数.不过,很多人只是会用,知道一些注意点.深入一点问的话,估计就答得不好.归其原因就是对Method Swizzli ... 
- 在LAMP的生产环境内添加PHP的cURL扩展模块
			服务器运行一段时间后,可能突然会需求添加某个扩展,如curl.pdo.xmlrpc等, 这就需要在不重新编译 PHP 的情况下独立添加扩展. 下面以安装curl为例,介绍具体安装步骤. 1.安装c ... 
- 编码解码--三种常见字符编码简介:ASCII、Unicode和UTF-8
			什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255( ... 
