angularJs 前端的页面分解与组装

简介:

实现前端页面的复用

将分解的页面写成directive. 例如下面这个样子:

Java代码   收藏代码
  1. angular.module('pageComponents', [], function($compileProvider){  
  2.   $compileProvider.directive('commonHeader', function($compile) {  
  3.     return {  
  4.       templateUrl: 'templete/common/common_header.html',  
  5.       replace: true,  
  6.       transclude: false,  
  7.       restrict: 'A',  
  8.       scope: false  
  9.     };  
  10.   });  
  11.   $compileProvider.directive('commonFooter', function($compile) {  
  12.     return {  
  13.       templateUrl: 'templete/common/common_footer.html',  
  14.       replace: true,  
  15.       transclude: false,  
  16.       restrict: 'A',  
  17.       scope: false  
  18.     };  
  19.   });  
  20. });  

 事实上,还可以更进一步,将templateUrl写成可传入的参数。但是那样的话就跟下面这个方法差不多了。

 

使用ng-include非常简单。请注意src的参数是表达式,如果要传静态的字符串参数,请用引号将参数包裹起来。就像下面这个例子。

Java代码   收藏代码
  1. <!-- header -->  
  2. <ng-include src="'common_header.html'"></ng-include>  
  3.           
  4. <div class="container">  
  5.     <!-- angular ng-view -->  
  6.     <div ng-view></div>  
  7.     <!-- /angular ng-view -->  
  8. </div>  
  9.           
  10. <!-- Footer -->  
  11. <ng-include src="'common_footer.html'"></ng-include>  

对ng-include稍作处理,可以实现更复杂的功能。例如下面这个动态加载表单页面的例子,就是通过变换ng-include的src参数实现的。src中的字符串会作为表达式处理(可以是$scope中的变量),所以直接写名字的话需要使用引号。

Java代码   收藏代码
  1. $compileProvider.directive("dynamicFormInput", ['$http''$templateCache',  
  2.   function($http, $templateCache) {  
  3.     return {  
  4.       restrict : 'E',  
  5.       scope : {  
  6.         model : '=',  
  7.         section : '='  
  8.       },  
  9.       template : '<ng:include src="tpl"></ng:include>',  
  10.       link : function(scope, iElement, iAttrs) {  
  11.         switch(scope.section.sectionTypeId) {  
  12.           case 1:  
  13.             $http.get('partials/survey/textInput.html', {  
  14.               cache : $templateCache  
  15.             });  
  16.             scope.tpl = "partials/survey/textInput.html";  
  17.             break;  
  18.           case 2:  
  19.             $http.get('partials/survey/selectOneOption.html', {  
  20.               cache : $templateCache  
  21.             });  
  22.             scope.tpl = "partials/survey/selectOneOption.html";  
  23.             break;  
  24.           case 6:  
  25.             if (scope.section.sectionId == 19) {  
  26.               $http.get('partials/survey/addressSelection.html', {  
  27.                 cache : $templateCache  
  28.               });  
  29.               scope.tpl = "partials/survey/addressSelection.html";  
  30.             }  
  31.             break;  
  32.         }  
  33.       }  
  34.     }  
  35. }]);  

最后必须说明的是,这三种方法实质上都是利用ajax来加载模板。使用ajax来实现页面分解这样的功能,相比传统的使用后台动态脚本语言的方案,必然会 带来额外的开销。事实上,不光AngularJS是这样,我所接触过的所有前端框架都是如此。这是浏览器端的宿命。这里所造成的负载和与后台动态脚本语言之间的优劣,只能由技术主管自己权衡。

 

ng-include

假设在我们的 controller 中

Java代码   收藏代码
  1. $scope.myPrimitive = 50;  
  2. $scope.myObject    = {aNumber: 11};  

 

每一个 ng-include 会生成一个子 Scope,每个子Scope 都继承父Scope
Java代码   收藏代码
  1. <script type="text/ng-template" id="/tpl1.html">  
  2.   <input ng-model="myPrimitive">  
  3.   </script>  
  4.   <div ng-include src="'/tpl1.html'"></div>  
  5.   
  6. <script type="text/ng-template" id="/tpl2.html">  
  7.   <input ng-model="myObject.aNumber">  
  8.   </script>  
  9.   <div ng-include src="'/tpl2.html'"></div>  
输入(比如”77″)到第一个 input 文本框,则子 Scope 将获得一个新的 myPrimitive 属性,覆盖掉父 Scope 的同名属性。这可能和你预想的不一样。
输入(比如”99″)到第二个 input 文本框,并不会在子 Scope 创建新的属性,因为 tpl2.html 将 model 绑定到了一个对象属性(an object property),原型继承在这时发挥了作用,ngModel 寻找对象 myObject 并且在它的父 Scope 中找到了。
如果我们不想把 model 从 number 基础类型改为对象,我们可以用 $parent 改写第一个模板:
Java代码   收藏代码
  1. <input ng-model="$parent.myPrimitive">  
输入(比如”22″)到这个文本框也不会创建新属性了。model 被绑定到了父 scope 的属性上(因为 $parent 是子 Scope 指向它的父 Scope 的一个属性)。
相关文章
|
3月前
|
缓存 前端开发 JavaScript
如何优化前端页面性能
前端性能优化是网站开发中非常重要的一部分,它直接关系到用户体验和网站的流量以及排名。本文将介绍一些优化前端页面性能的方法,包括减少HTTP请求、压缩代码、使用CDN等。
|
2月前
|
存储 前端开发 JavaScript
【JavaEE初阶】 博客系统项目--前端页面设计实现
【JavaEE初阶】 博客系统项目--前端页面设计实现
|
6月前
|
缓存 前端开发 JavaScript
【前端用法】jquery获取当前页面的URL信息
【前端用法】jquery获取当前页面的URL信息
52 0
|
6月前
|
前端开发 安全 JavaScript
关于前端页面测试和抵御 clickjacking attack 的一些方法
关于前端页面测试和抵御 clickjacking attack 的一些方法
51 0
|
2月前
|
存储 前端开发 安全
无限连接:前端跨页面通信的实现与应用
在前端开发中,有时我们需要在不同的页面之间进行数据传递和交互。这种场景下,前端跨页面通信就显得尤为重要。前端跨页面通信是指在不同的页面之间传递数据、发送消息以及实现页面间的交互操作。本文将详细介绍前端跨页面通信的属性、应用场景以及实现方法,并提供一些代码示例和引用资料,帮助读者深入了解并应用这一重要的技术。
|
7月前
|
开发框架 前端开发 JavaScript
前端框架Layui的使用讲解(Layui搭建登录注册页面)(一)
前端框架Layui的使用讲解(Layui搭建登录注册页面)
431 0
|
3月前
|
移动开发 监控 前端开发
HTML5与CSS3教学:美化员工行为监控软件前端页面的代码技巧
在当今信息时代,企业对员工行为的监控成为了一项必不可少的工作。而员工行为监控软件作为一种高效的管理工具,其前端页面的设计和美化显得尤为重要。本文将介绍如何利用HTML5和CSS3技术,优雅地美化员工行为监控软件前端页面的代码技巧。
213 0
|
4月前
|
JSON 前端开发 Java
(简易详细)spring boot 使用拦截器 实现拦截前端请求并返回json到前端页面
(简易详细)spring boot 使用拦截器 实现拦截前端请求并返回json到前端页面
109 0
|
4月前
|
前端开发
前端知识笔记(十八)———页面首次滑动不可返回
前端知识笔记(十八)———页面首次滑动不可返回
19 0
|
5月前
|
JavaScript 前端开发 Java
在Vue中通过ElementUI构建前端页面【登录,注册】,在IEDA构建后端实现前后端分离
在Vue中通过ElementUI构建前端页面【登录,注册】,在IEDA构建后端实现前后端分离
147 0