activiti自定义流程之整合二:使用angular js整合ueditor创建表单

注:整体环境搭建:activiti自定义流程之整合(一):整体环境配置


基础环境搭建完毕,接下来就该正式着手代码编写了,在说代码之前,我觉得有必要先说明一下activit自定义流程的操作。



抛开自定义的表单不谈,通过之前的了解,我们知道一个新的流程开始,是在启动流程实例(processIntence)的时候,而流程实例依赖于流程定义(processDefinition),流程定义又依赖于流程模型(model)。


我们用到的自定义表单需要在创建模型,画模型图的时候就指定表单的名称formKey,需要保证这个formKey和我们创建的表单名称一致。


表单并不在创建模型的时候使用,而是在部署的时候用到,因此只要是在部署流程定义之前创建自定义表单,那么无论是先创建模型还是先创建表单,只要名称一致就行。


那么我这里就先创建表单,因为我觉得这样的话,在创建模型时可以预览,更能保证创建模型的正确性(虽然模型也可以修改);


与之前的自定义表单稍有不同的是,在这个整合的例子中,我用的是angularjs,同时预览时也用到了jquery中的dialog对话框的功能,也就需要比之前导入更多前端的js,他们如下图所示。



需要注意的是,dialog的样式在jquery-ui.js中控制,这个也是网上下载的。


前端首页index.html代码如下,因为angular js为单页面应用,因此实际上只有一个html声明,所有的js以及css文件也都需要在index.html中一开始就导入进来:
<!DOCTYPE html>
<html ng-app="activitiApp">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <link href="./activi_css/activi.css" rel="stylesheet"/> 
  <script type="text/javascript">
        var _root='http://form/index.php?s=/',_controller = 'index';
  </script>
  <script src="./angular-1.4.0-rc.2/angular.js"></script>
  <script src='./angular-1.4.0-rc.2/angular-ui-router.js'></script>
  <script src='./activi_js/app.js'></script>
  <script src='./activi_js/createCtr.js'></script>
  <script src='./activi_js/modelCtr.js'></script>
  <script src='./activi_js/processCtr.js'></script>
  <script src='./activi_js/taskCtr.js'></script>
  <script src='./activi_js/findFirstTaskCtr.js'></script>
  <script src='./activi_js/loginCtr.js'></script>
  <script src='./activi_js/hisTaskCtr.js'></script>
  <script src='./activi_js/completeTaskCtr.js'></script>
  <script src='./activi_js/completeTaskTo1Ctr.js'></script>
  <script src="./my_js/updateFormCtr.js"></script>
  <script src="./my_js/formListCtr.js"></script>
  <!-- 导入form相关的js -->
    <!--  <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <link href="form_css/bootstrap/css/bootstrap.css?2023" rel="stylesheet" type="text/css" />
    <link href="form_css/site.css?2023" rel="stylesheet" type="text/css" />-->
    <link href="form_css/jquery-ui.css" rel="stylesheet" type="text/css" />
    <link href="my_css/a.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript">
        var _root='http://form/index.php?s=/',_controller = 'index';
    </script> 
    <script src="form_js/jquery-1.7.2.min.js?2023"></script>
    <script src="form_js/common.js"></script>
    <script src="form_js/jquery-ui.js"></script>
    <script src="form_js/jquery.form.js"></script>
    <script src="form_js/ajax.js"></script>
    <script src="form_js/common/plugins/validate/jquery.validate.pack.js"></script>
    <script src="form_js/jquery.datetimepicker.js"></script>
    <script src="form_js/ueditor/ueditor.config.js?2023"></script>
    <script src="form_js/ueditor/ueditor.all.js?2023"> </script>
    <script src="form_js/ueditor/lang/zh-cn/zh-cn.js?2023"></script>
    <script src="form_js/ueditor/formdesign/leipi.formdesign.v4.js?2023"></script>
  <!-- 导入form相关的js -->
</head>
<body style="width:100%;height:400px;margin:0;background-color:#fff">
 <div style="height:70px;width:100%;border:1px solid #ccf">
    <img id="rdiv" src="./images/activiti.png" style="width:30%;height:98%"/>
     <a href="script:;" ng-show="userName!=undefined" style="margin-right:10px;float:right;margin-top:25px;" ng-click="logOut();">
    [退出登陆]
    </a>
    <font ng-show="userName!=undefined" style="margin-right:10px;float:right;margin-top:25px;">当前登陆用户:{{userName}}</font>
 </div>
 <div style="width:100%;position: absolute;height:auto">
 <div style="height:630px;width:12%;font-size:36px;position:relative;float:left;border:1px solid #ccf" ng-show="userName!=undefined">
    <table style="width:100%;text-align:center;margin-top:0px" cellSpacing="5px" cellPadding="0px">
      <tr>
         <td style="background-color:#aac;"><a href="#/create">创建模型</a></td>
      </tr>
      <tr>
         <td style="background-color:#acd;"> <a href="#/modelList">模型列表</a></td>
      </tr>
      <tr>
         <td style="background-color:#aac;"><a href="#/processList">流程列表</a></td>
      </tr>
      <tr>
         <td style="background-color:#acd;"><a href="#/findFirstTask">我的申请</a></td>
      </tr>
      <tr>
         <td style="background-color:#aac;"><a href="#/taskList">我的任务</a></td>
      </tr>
      <tr>
         <td style="background-color:#acd;"><a href="#/hisTask">历史任务</a></td>
      </tr>
      <tr>
         <td style="background-color:#aac;"><a href="#/createForm">创建表单</a></td>
      </tr>
      <tr>
         <td style="background-color:#acd;"><a href="#/formList">表单列表</a></td>
      </tr>
    </table>
 </div>
 
 <div ui-view="view" ></div>
 </div>
</body>
</html>




Angular js 控制路由跳转app.js代码:

var app=angular.module('activitiApp',['ui.router']);  
app.run(function($rootScope) {
	$rootScope.logOut=function(){
		$http.post("./loginOut.do").success(function(loginOutResult){
			$rootScope.userName=undefined;
			$location.path("/login");
		});
	}
});
app.config(function($stateProvider,$urlRouterProvider){  
   $stateProvider  
   .state('createForm',{  
   url: "/createForm",views: {  
      'view': {  
       templateUrl: 'my_views/updateForm.html',controller: 'updateFormCtr'  
      }  
   }  
  });  
  
  
});  


新增form表单的页面updateForm.html代码如下,要注意的是,这个页面也是有ueditor插件中的index.html改变过来的:
<div id="formDiv" style="margin-top:20px;margin-left:50px;height:550px;width:70%;font-size:18px;position:relative;float:left;">
<div class="container">
<form method="post" id="saveform" name="saveform" action="/index.php?s=/index/parse.html">
<input type="hidden" name="fields" id="fields" value="0">
<div style="width:98%;height:500px;margin-top:20px;border:3px solid grey">
  <p style="margin-top:10px;font-size:30px" >表单名称:<input type="text" id="formType"></input></p>
  <hr style="height:5px;border:none;border-top:5px ridge green;"/>
  <p style="margin-top:10px;font-size:30px" >表单设计:</p>
 <div >
<p style="left:30px">
        <button type="button" ng-click="leipiFormDesign.exec('text');" class="btn btn-info">文本框</button>
        <button type="button" ng-click="leipiFormDesign.exec('textarea');" class="btn btn-info">多行文本</button>
        <button type="button" ng-click="leipiFormDesign.exec('select');" class="btn btn-info">下拉菜单</button>
        <button type="button" ng-click="leipiFormDesign.exec('radios');" class="btn btn-info">单选框</button>
        <button type="button" ng-click="leipiFormDesign.exec('checkboxs');" class="btn btn-info">复选框</button>       
        <button type="button" ng-click="leipiFormDesign.exec('listctrl');" class="btn btn-info">列表控件</button>
        <button type="button" ng-click="leipiFormDesign.findForm();" class="btn btn-info">form</button>
</p>
</div>
<!-- afsddddddddd -->
<div >
<script id="myFormDesign" type="text/plain" style="width:99.8%;">
</script>
</div>   
</div>
<!-- afsddddddddd -->
<div class="row">
</div><!--end row-->
</form>
</div><!--end container-->
</div>


对应的js代码updateFormCtr.js,这里尤其需要注意的是leipiFormDesign.exec这个方法原本是ueditor插件中的,如果不做修改直接拿过来的话,在上便的页面中是无法调用的,angularjs需要注意作用域的问题,因此在对应的js中需要改成$scope. leipiFormDesign;除此之外,在保存和预览时基本没有什么变化,dialog对话框也是在后续流程中使用到:
angular.module('activitiApp')  
.controller('updateFormCtr',['$rootScope','$scope','$http','$location','$state',function($rootScope,$scope,$http,$location,$state){  
	$http.post("createFlush.do").success(function(result){
		if(result.isLogin==="yes"){
			$rootScope.userName=result.userName;
			
		}else{
			$location.path("/login");
		}
	});
	
	//预览
	UE.registerUI('button_preview',function(editor,uiName){
	    if(!this.options.toolleipi)
	    {
	        return false;
	    }
	    //注册按钮执行时的command命令,使用命令默认就会带有回退操作
	    editor.registerCommand(uiName,{
	        execCommand:function(){
	            try {
	                $scope.leipiFormDesign.fnReview();
	            } catch ( e ) {
	                alert('leipiFormDesign.fnReview 预览异常');
	            }
	        }
	    });
	    //创建一个button
	    var btn = new UE.ui.Button({
	        //按钮的名字
	        name:uiName,//提示
	        title:"预览",//需要添加的额外样式,指定icon图标,这里默认使用一个重复的icon
	        cssRules :'background-position: -420px -19px;',//点击时执行的命令
	        onclick:function () {
	            //这里可以不用执行命令,做你自己的操作也可
	           editor.execCommand(uiName);
	        }
	    });


	    //因为你是添加button,所以需要返回这个button
	    return btn;
	});
	//保存
	UE.registerUI('button_save',{
	        execCommand:function(){
	            try {
	                $scope.leipiFormDesign.fnCheckForm('save');
	            } catch ( e ) {
	                alert('leipiFormDesign.fnCheckForm("save") 保存异常');
	            }
	            
	        }
	    });
	    //创建一个button
	    var btn = new UE.ui.Button({
	        //按钮的名字
	        name:uiName,//提示
	        title:"保存表单",//需要添加的额外样式,指定icon图标,这里默认使用一个重复的icon
	        cssRules :'background-position: -481px -20px;',所以需要返回这个button
	    return btn;
	});


	
	
//整合设计器
	 var leipiEditor = UE.getEditor('myFormDesign',{
         toolleipi:true,//是否显示,设计器的 toolbars
         textarea: 'design_content',//这里可以选择自己需要的工具按钮名称,此处仅选择如下五个
        toolbars:[[
         ]],//关闭字数统计
         wordCount:false,//关闭elementPath
         elementPathEnabled:false,//默认的编辑区域高度
         initialFrameHeight:260
         //,iframeCssUrl:"css/bootstrap/css/bootstrap.css" //引入自身 css使编辑器兼容你网站css
         //更多其他参数,请参考ueditor.config.js中的配置项
     });


   $scope.leipiFormDesign = {
	findForm : function(){
		window.location.href="my_views/formList.html";
	},/*执行控件*/
    exec : function (method) {
        leipiEditor.execCommand(method);
    },/*
        Javascript 解析表单
        template 表单设计器里的Html内容
        fields 字段总数
    */
   parse_form:function(template,fields)
    {
        //正则  radios|checkboxs|select 匹配的边界 |--|  因为当使用 {} 时js报错
        var preg =  /(\|-<span(((?!<span).)*leipiplugins=\"(radios|checkboxs|select)\".*?)>(.*?)<\/span>-\||<(img|input|textarea|select).*?(<\/select>|<\/textarea>|\/>))/gi,preg_attr =/(\w+)=\"(.?|.+?)\"/gi,preg_group =/<input.*?\/>/gi;
        if(!fields) fields = 0;
        var template_parse = template,template_data = new Array(),add_fields=new Object(),checkboxs=0;
        var pno = 0;
        template.replace(preg,function(plugin,p1,p2,p3,p4,p5,p6){
            var parse_attr = new Array(),attr_arr_all = new Object(),name = '',select_dot = '',is_new=false;
            var p0 = plugin;
            var tag = p6 ? p6 : p4;
            //alert(tag + " \n- t1 - "+p1 +" \n-2- " +p2+" \n-3- " +p3+" \n-4- " +p4+" \n-5- " +p5+" \n-6- " +p6);
            if(tag == 'radios' || tag == 'checkboxs')
            {
                plugin = p2;
            }else if(tag == 'select')
            {
                plugin = plugin.replace('|-','');
                plugin = plugin.replace('-|','');
            }
            plugin.replace(preg_attr,function(str0,attr,val) {
                    if(attr=='name')
                    {
                        if(val=='leipiNewField')
                        {
                            is_new=true;
                            fields++;
                            val = 'data_'+fields;
                        }
                        name = val;
                    }
                    
                    if(tag=='select' && attr=='value')
                    {
                        if(!attr_arr_all[attr]) attr_arr_all[attr] = '';
                        attr_arr_all[attr] += select_dot + val;
                        select_dot = ',';
                    }else
                    {
                        attr_arr_all[attr] = val;
                    }
                    var oField = new Object();
                    oField[attr] = val;
                    parse_attr.push(oField);
            }) 
            /*alert(JSON.stringify(parse_attr));return;*/
             if(tag =='checkboxs') /*复选组  多个字段 */
             {
                plugin = p0;
                plugin = plugin.replace('|-','');
                var name = 'checkboxs_'+checkboxs;
                attr_arr_all['parse_name'] = name;
                attr_arr_all['name'] = '';
                attr_arr_all['value'] = '';
                
                attr_arr_all['content'] = '<span leipiplugins="checkboxs"  title="'+attr_arr_all['title']+'">';
                var dot_name ='',dot_value = '';
                p5.replace(preg_group,function(parse_group) {
                    var is_new=false,option = new Object();
                    parse_group.replace(preg_attr,k,val) {
                        if(k=='name')
                        {
                            if(val=='leipiNewField')
                            {
                                is_new=true;
                                fields++;
                                val = 'data_'+fields;
                            }


                            attr_arr_all['name'] += dot_name + val;
                            dot_name = ',';


                        }
                        else if(k=='value')
                        {
                            attr_arr_all['value'] += dot_value + val;
                            dot_value = ',';


                        }
                        option[k] = val;    
                    });
                    
                    if(!attr_arr_all['options']) attr_arr_all['options'] = new Array();
                    attr_arr_all['options'].push(option);
                    //if(!option['checked']) option['checked'] = '';
                    var checked = option['checked'] !=undefined ? 'checked="checked"' : '';
                    attr_arr_all['content'] +='<input type="checkbox" name="'+option['name']+'" value="'+option['value']+'"  '+checked+'/>'+option['value']+'';


                    if(is_new)
                    {
                        var arr = new Object();
                        arr['name'] = option['name'];
                        arr['leipiplugins'] = attr_arr_all['leipiplugins'];
                        add_fields[option['name']] = arr;
                    }
                });
                attr_arr_all['content'] += '</span>';


                //parse
                template = template.replace(plugin,attr_arr_all['content']);
                template_parse = template_parse.replace(plugin,'{'+name+'}');
                template_parse = template_parse.replace('{|-','');
                template_parse = template_parse.replace('-|}','');
                template_data[pno] = attr_arr_all;
                checkboxs++;


             }else if(name)
            {
                if(tag =='radios') /*单选组  一个字段*/
                {
                    plugin = p0;
                    plugin = plugin.replace('|-','');
                    plugin = plugin.replace('-|','');
                    attr_arr_all['value'] = '';
                    attr_arr_all['content'] = '<span leipiplugins="radios" name="'+attr_arr_all['name']+'" title="'+attr_arr_all['title']+'">';
                    var dot='';
                    p5.replace(preg_group,function(parse_group) {
                        var option = new Object();
                        parse_group.replace(preg_attr,val) {
                            if(k=='value')
                            {
                                attr_arr_all['value'] += dot + val;
                                dot = ',';
                            }
                            option[k] = val;    
                        });
                        option['name'] = attr_arr_all['name'];
                        if(!attr_arr_all['options']) attr_arr_all['options'] = new Array();
                        attr_arr_all['options'].push(option);
                        //if(!option['checked']) option['checked'] = '';
                        var checked = option['checked'] !=undefined ? 'checked="checked"' : '';
                        attr_arr_all['content'] +='<input type="radio" name="'+attr_arr_all['name']+'" value="'+option['value']+'"  '+checked+'/>'+option['value']+'';


                    });
                    attr_arr_all['content'] += '</span>';


                }else
                {
                    attr_arr_all['content'] = is_new ? plugin.replace(/leipiNewField/,name) : plugin;
                }
                template = template.replace(plugin,'');
                if(is_new)
                {
                    var arr = new Object();
                    arr['name'] = name;
                    arr['leipiplugins'] = attr_arr_all['leipiplugins'];
                    add_fields[arr['name']] = arr;
                }
                template_data[pno] = attr_arr_all;   
            }
            pno++;
        })
        var parse_form = new Object({
            'fields':fields,//总字段数
            'template':template,//完整html
            'parse':template_parse,//控件替换为{data_1}的html
            'data':template_data,//控件属性
            'add_fields':add_fields//新增控件
        });
        return JSON.stringify(parse_form);
    },/*type  =  save 保存设计 versions 保存版本  close关闭 */
    fnCheckForm : function ( type ) {
    	var formType=document.getElementById("formType").value;
        if(leipiEditor.queryCommandState( 'source' ))
            leipiEditor.execCommand('source');//切换到编辑模式才提交,否则有bug   
        if(leipiEditor.hasContents()){
            leipiEditor.sync();/*同步内容*/
            //--------------以下仅参考-----------------------------------------------------------------------------------------------------
            var type_value='',formid=0,fields=$("#fields").val(),formeditor='';


            if( typeof type!=='undefined' ){
                type_value = type;
            }
            console.log(document.getElementById("formType"));
            //获取表单设计器里的内容
            formeditor=leipiEditor.getContent();
            //解析表单设计器控件
            var parse_form = this.parse_form(formeditor,fields);
             //异步提交数据
             $.ajax({
                type: 'POST',url : './addForm.do',dataType : 'html',async:false,//contentType: 'application/json;charset=utf-8',data : {'type' : type_value,'formid':formid,'parse_form':parse_form,"formType":formType},success : function(data){
                	alert("保存成功");
                	window.location.href ="#/formList";
                }
            });
            
        } else {
            alert('表单内容不能为空!')
            $('#submitbtn').button('reset');
            return false;
        }
    },/*预览表单*/
    fnReview : function (){
    	console.log("111");
        if(leipiEditor.queryCommandState( 'source' ))
            leipiEditor.execCommand('source');/*切换到编辑模式才提交,否则部分浏览器有bug*/
        if(leipiEditor.hasContents()){
        	console.log("222");
            leipiEditor.sync();       /*同步内容*/
            //--------------以下仅参考-------------------------------------------------------------------
            /*设计form的target 然后提交至一个新的窗口进行预览*/
            var type_value='',formeditor='';
            var formType=document.getElementById("formType").value;
            if( typeof type!=='undefined' ){
                type_value = type;
            }
            console.log("333");
            //获取表单设计器里的内容
            formeditor=leipiEditor.getContent();
            //解析表单设计器控件
            var parse_form = this.parse_form(formeditor,fields);
            var forms=JSON.parse(parse_form);
            console.log(forms);
            console.log(typeof forms);
            console.log(forms.template);
            var forms1=forms.template;
            	win_parse=window.open('','','width=800,height=400,alwaysRaised=yes,top=100,left=200');
            	//win_parse=window.open('','mywin',"menubar=0,toolbar=0,status=0,resizable=1,left=0,top=0,scrollbars=1,width=" +(screen.availWidth-10) + ",height=" + (screen.availHeight-50) + "\"");
            	var str='<div style="width:500px;height:300px;border:1px solid grey">'+forms1+'</div>';
                win_parse.document.write(forms1);
                win_parse.focus();     
        } else {
            alert('表单内容不能为空!');
            return false;
        }
    }
  };
 }])
相对于前台而言,后台在这里就没有什么变化了,可以参考之前的自定义表单,代码便不再罗列。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


ANGULAR.JS:NG-SELECTANDNG-OPTIONSPS:其实看英文文档比看中文文档更容易理解,前提是你的英语基础还可以。英文文档对于知识点讲述简明扼要,通俗易懂,而有些中文文档读起来特别费力,基础差、底子薄的有可能一会就会被绕晕了,最起码英文文档中的代码与中文文档中的代码是一致的,但知识点讲述实在是差距太大。Angular.jshasapowerfuldire
AngularJS中使用Chart.js制折线图与饼图实例  Chart.js 是一个令人印象深刻的 JavaScript 图表库,建立在 HTML5 Canvas 基础上。目前,它支持6种图表类型(折线图,条形图,雷达图,饼图,柱状图和极地区域区)。而且,这是一个独立的包,不依赖第三方 JavaScript 库,小于 5KB。   其中用到的软件:   Chart.js框架,版本1.0.2,一
IE浏览器兼容性后续前言 继续尝试解决IE浏览器兼容性问题,结局方案为更换jquery、angularjs、IE的版本。 1.首先尝试更换jquery版本为1.7.2 jquery-1.9.1.js-->jquery-1.7.2.js--> jquery2.1.4.js 无效 2.尝试更换IE版本IE8 IE11-
Angular实现下拉菜单多选写这篇文章时,引用文章地址如下:http://ngmodules.org/modules/angularjs-dropdown-multiselecthttp://dotansimha.github.io/angularjs-dropdown-multiselect/#/AngularJSDropdownMultiselectThisdire
在AngularJS应用中集成科大讯飞语音输入功能前言 根据项目需求,需要在首页搜索框中添加语音输入功能,考虑到科大讯飞语音业务的强大能力,遂决定使用科大讯飞语音输入第三方服务。软件首页截图如下所示: 涉及的源代码如下所示: //语音识别$rootScope.startRecognize = function() {var speech;
Angular数据更新不及时问题探讨前言 在修复控制角标正确变化过程中,发觉前端代码组织层次出现了严重问题。传递和共享数据时自己使用的是rootScope,为此造成了全局变量空间的污染。根据《AngularJs深度剖析与最佳实践》,如果两个控制器的协作存在大量的数据共享和交互可以利用Factory等服务的“单例”特性为它们注入一个共享对象来传递数据。而自己在使用rootScope
HTML:让表单、文本框只读,不可编辑的方法有时候,我们希望表单中的文本框是只读的,让用户不能修改其中的信息,如使中国">的内容,"中国"两个字不可以修改。实现的方式归纳一下,有如下几种。方法1:onfocus=this.blur()中国"onfocus=this.blur()>方法2:readonly中国"readonly>中国"readonly="tru
在AngularJS应用中实现微信认证授权遇到的坑前言 项目开发过程中,移动端新近增加了一个功能“微信授权登录”,由于自己不是负责移动端开发的,但最后他人负责的部分未达到预期效果。不能准确实现微信授权登录。最后还得靠自己做进一步的优化工作,谁让自己是负责人呢?原来负责人就是负责最后把所有的BUG解决掉。 首先,熟悉一下微信授权部分的源代码,如下所示:
AngularJS实现二维码信息的集成思路需求 实现生成的二维码包含订单详情信息。思路获取的内容数据如下: 现在可以获取到第一级数据,第二级数据data获取不到。利用第一级数据的获取方法获取不到第二级数据。for(i in data){alert(i); //获得属性 if(typeof(data[i]) == "o
Cookie'data'possiblynotsetoroverflowedbecauseitwastoolarge(5287>4096bytes)!故事起源 项目开发过程中遇到以上问题,刚开始以为只是个警告,没太在意。后来发现直接影响到了程序的执行效果。果断寻找解决方法。问题分析 根据Chrome浏览器信息定位,显示以下代码存在错误:
AngularJS控制器controller之间如何通信angular控制器通信的方式有三种:1,利用作用域继承的方式。即子控制器继承父控制器中的内容2,基于事件的方式。即$on,$emit,$boardcast这三种方式3,服务方式。写一个服务的单例然后通过注入来使用利用作用域的继承方式由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值
AngularJS路由问题解决遇到了一个棘手的问题:点击优惠详情时总是跳转到药店详情页面中去。再加一层地址解决了,但是后来发现问题还是来了:Couldnotresolve'yhDtlMaintain/yhdetail'fromstate'yhMaintain'药店详情http://192.168.1.118:8088/lmapp/index.html#/0优惠券详情
书海拾贝之特殊的ng-src和ng-href在说明这两个指令的特殊之前,需要先了解一下ng的启动及执行过程,如下:1)浏览器加载静态HTML文件并解析为DOM;2)浏览器加载angular.js文件;3)angular监听DOMContentLoaded事件,监听到时开始启动;4)angular寻找ng-app指令,确定作用范围;
angularjs实现页面跳转并进行参数传递Angular页面传参有多种办法,我在此列举4种最常见的:1.基于ui-router的页面跳转传参(1)在AngularJS的app.js中用ui-router定义路由,比如现在有两个页面,一个页面(producers.html)放置了多个producers,点击其中一个目标,页面跳转到对应的producer页,同时将producerId
AngularJS实现表格数据的编辑,更新和删除效果实现首先,我们先建立一些数据,当然你可以从你任何地方读出你的数据var app = angular.module('plunker', ['ui.bootstrap']);app.controller('MainCtrl', function($scope) { $scope.name = 'World'; $sc
ANGULAR三宗罪之版本陷阱      坑!碰到个大坑,前面由于绑定日期时将angular版本换为angular-1.3.0-beta.1时,后来午睡后,登录系统,发现无论如何都登陆不进去了,经过调试,发现数据视图已经无法实现双向绑定了。自己还以为又碰到了“僵尸程序”了呢,对比药店端的程序发现并没有什么不同之处。后来自己经过一番思索才隐约感觉到是不是angular的版本造成的,将版本换为之前
JS实现分页操作前言 项目开发过程中,进行查询操作时有可能会检索出大量的满足条件的查询结果。在一页中显示全部查询结果会降低用户的体验感,故需要实现分页显示效果。受前面“JS实现时间选择插件”的启发,自己首先需要查看一下HTML5能否实现此效果。 整了半天,不管是用纯CSS3也好,还是用tmpagination.js还是bootstrap组件也好,到最后自己静下心来理
浏览器兼容性解决之道前言 浏览器兼容性一直是前端开发中不得不面对的一个问题。而最突出的就是IE。对绝大多数公司来说,兼容IE6的性价比已经很低,而IE7则几乎已经绝迹。所以,常见的兼容性下限是IE8。这也正是Angular1.2x的兼容性目标,Angular团队声明:Angular的持续集成服务器会在IE8下运行所有的测试。但这些测试不会运行在IE7及以下版本,它们也不会保证An
JS利用正则表达式校验手机号绪 由于项目需求,需要在前端实现手机号码的校验。当然了,对于基本的格式校验应该放在客户端进行,而不需要再将待校验的手机号发送至服务端,在服务端完成校验,然后将校验结果返回给客户端,客户端根据返回的结果再进行进一步的处理。如此反而复杂化了处理过程。 其实,处于安全考虑,应该在服务端进行二次校验。以下为在客户端的JS中校验手机号码格式
基于项目实例解析ng启动加载过程前言 在AngularJS项目开发过程中,自己将遇到的问题进行了整理。回过头来总结一下angular的启动过程。 下面以实际项目为例进行简要讲解。1.载入ng库2.等待,直到DOM树构造完毕。3.发现ng-app,自动进入启动引导阶段。4.根据ng-app名称找到相应的路由。5.加载默认地址。6.Js顺序执行,加载相应模版页sys_tpls/