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 的一个属性)。

时间: 2025-01-28 10:27:20

angularJs 前端的页面分解与组装的相关文章

Angularjs中的页面访问权限怎么设置_AngularJS

在以往的项目中,前后端常见的配合方式是前端提供页面和ui加一点DuangDuangDuang的效果,后端搭建框架数据结构和数据交互(数据交互前后端有交集),不管是.net.java or php都能一对多的提供前端服务,然而在新形式下项目中运用了前端框架,开发情况就不一样了,比如我要说的这是在angular框架下完成的开发,模式是后端提供服务和api文档,页面和数据交互及逻辑处理由前端完成,前端俨然是个完全的programer了,这个过程中就会遇到之前意想不到的问题(如果没有做过后端开发),比如

初学angularjs,想知道angularjs如何判断页面加载完成?

问题描述 初学angularjs,想知道angularjs如何判断页面加载完成? 初学angularjs,想知道angularjs如何判断页面加载完成? 解决方案 page.loaded事件

java中文乱码-java开发前端ftl页面上传一个中文的字段到java后台变成乱码!

问题描述 java开发前端ftl页面上传一个中文的字段到java后台变成乱码! 有没有比在后台写一些转换格式的代码更简单的方式?是不是我哪里的格式没有设置好? 解决方案 找到答案了.原来是我tomcat的编码格式没有设置成utf-8. 解决方案二: ftl文件默认的编码格式是GBK的,但是它输出的编码格式是utf-8的.中文就会显示乱码.在改变ftl文件的编码格式之前,将页面整个copy到txt文档中,然后改变编码格式之后,再将txt文件中的内容复制到原来的文件中. 解决方案三: 客户端 编码格

thinkphp前端引导页面index.php搭建手机版网站

代码中的函数 is_mobile来源于网上,写得挺好的.入口文件通过判断终端类型,定义APP_PATH和APP_NAME,从而执行不同的分组.我要实现的效果是PC和Mobile均用顶级域名访问.当然了,如果你想在手机里实现类似于wap.xxx.com这样的访问,本方法是做不到的,这是thinkphp多域名部署的问题,具体参见tp手册.用thinkphp框架快速开发一个小型站点还是很方便的,正如本站.菜根网还做了一个手机端的网站,手机浏览器输入本站域名www.icaigen.com查看效果. 下面

AngularJS如何打开页面隐藏显示表达式的教程

本文实例讲述了AngularJS打开页面隐藏显示表达式用法.分享给大家供大家参考,具体如下: 1.使用 ng-cloak, 同时要在css加入一行 [ng-cloak] {display: none;} 样式 [ng:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak { display: none !important; } 2.使用ng-bind, 代替{{}} 这个不太方便,因为使用ng-bin

基于AngularJS前端云组件最佳实践_AngularJS

AngularJS是google设计和开发的一套前端开发框架,他能帮助开发人员更便捷地进行前端开发.AngularJS是为了克服HTML在构建应用上的不足而设计的,它非常全面且简单易学习,因此AngularJS快速的成为了javascript的主流框架. 一.Amazing的Angular AnguarJS的特性 方便的REST: RESTful逐渐成为了一种标准的服务器和客户端沟通的方式.你只需使用一行javascript代码,就可以快速的从服务器端得到数据.AugularJS将这些变成了JS

ThinkPHP实现在可视化后台管理永久修改前端视图页面的方法

我一直以来就在纳闷意见事情,就是像csdn一样,用户可以自己去修改自己的主页样式,而且是永久性的修改,很多的地方都请到了,把视图样式交给用户这也是未来发展的趋势,想QQ空间装扮,甚至一些建站程序的后台都是这样的,所以,把这个原理明白是非常重要的. 首先这个显然不可能通过前端的来实现,因为前段的东西到用户那里最终是放到内存里面,内存是有易失性,那么就应该是放在后台,同样的,我们也不可能去直接修改后台文件,这样代价非常大,那么就要把他们放入数据库中,数据库中的数据时存在硬盘里面的,不容易丢失,而且通

AngularJs前端环境搭建

最近刚开始做angular项目,开始搭建开发环境,刚开始的时候用express搭了本地服务,然后开发angular的静态项目,项目用gulp做自动化管理,做了一段时间感觉不是很方便,于是开始考虑用webpack来做.网上找了一下,相关的文章不少,最后参考来一个老外的例子做,实践下来感觉还不错,下面说一下详细的项目架构. 结构和配置 启动文件是app.js,各子页面放到对应的目录中,utils是可提取的工具类组件,angular的项目结构应该都差不多. webpack配置主要是几个loader l

AngularJS (前端MVC框架)

AngularJS是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS的核心特点是:MVVM.模块化.自动化双向数据绑定.语义化标签.依赖注入. 适用于:构建CRUD web应用.(CDUQ,数据的增删改查). 不适用于:游戏,图形界面编辑器.这种DOM操作很频繁也很复杂的应用,和CRUD应用就有很大的不同,它们不适合用AngularJS来构建.像这种情况用一些更轻量.简单的技术如jQuery可能会更好. 参考 官方API : http://docs.ngnice.