angular学习笔记之动态试图

在应用级开发中,我们经常会动态将一段html作为试图进行展示,这是很常用的功能,然而angular并未直接给出相应的解决方案,那我们应该如何来做?

说到如何实现动态试图功能,那我们就得去研究下angular-router,angular-router提供了动态路由、动态试图的机制。

angular-router版本:AngularJS v1.3.9-local+sha.a3c3bf3

第975行:

 1 ngViewFillContentFactory.$inject = [‘$compile‘, ‘$controller‘, ‘$route‘];
 2 function ngViewFillContentFactory($compile, $controller, $route) {
 3   return {
 4     restrict: ‘ECA‘,
 5     priority: -400,
 6     link: function(scope, $element) {
 7       var current = $route.current,
 8           locals = current.locals;
 9
10       $element.html(locals.$template);
11
12       var link = $compile($element.contents());
13
14       if (current.controller) {
15         locals.$scope = scope;
16         var controller = $controller(current.controller, locals);
17         if (current.controllerAs) {
18           scope[current.controllerAs] = controller;
19         }
20         $element.data(‘$ngControllerController‘, controller);
21         $element.children().data(‘$ngControllerController‘, controller);
22       }
23
24       link(scope);
25     }
26   };
27 }

这是ngview的指令代码,这里我们主要关注两句话:

$element.html(locals.$template);//将读取的html插入到相应的dom对象中
var link = $compile($element.contents());//编译html模板

原来如此啊,新加入的模板(试图)只需要从新编译下即可。

好了那么我们来做个一个辅助方法(本人刚学angular很多东西还没来得急研究,对jquery熟习,因此下面的辅助方法使用了jquery):

(function () {
    var compileView = function (dom) {
        //获取该dom所在的app
        var appElement = $(dom).closest(".ng-scope[ng-app]");
        //获取app的注入器
        var injector = appElement.data("$injector");
        injector.invoke(function ($compile) {
            var scope = $(dom).scope();
            //编译模板(试图)
            $compile($(dom))(scope);
            //通知更改
            scope.$apply();
        });
    }

    //扩展angular
    $.extend(angular, {
        //动态编译试图
        compileView: compileView
    });

    //基于jquery的扩展,实现动态试图
    $.fn.compileView = function () {
        var dom = this;
        compileView(this);
    }
})(jQuery);

这里提供了两种方式一种是基于jquery的扩展,一种是基于angular的扩展。

代码很简单,不多解释了,来个例子:

1         $(function () {
2             $("#btnLoadView").click(function () {
3                 $("#dynamicView").load("dynamicView.html", function () {
4                     angular.compileView(this);
5                 });
6             });
7         });
时间: 2024-08-02 02:49:22

angular学习笔记之动态试图的相关文章

angular学习笔记之动态路由

angular自带的angular-router不支持多级路由,第三方的ui-router是基于state的,虽然支持多级路由,但需要写N多的state,感觉很不爽有没有? 其实只要我们搞明白下面几个问题,自己开发一套路由也是很简单的: 1.当url改变之后,angular如果捕获到改变事件? 2.如何装载新的改变事件? 在angular源码中搜索onUrlChange(~~!竟然真有这个方法): 1 self.onUrlChange = function(callback) { 2 // TO

angular学习笔记(一)

入门实例: 一个购物车产品清单,可以自行改变数量,总价自动计算的小例子: 代码如下: <!DOCTYPE html> <html ng-app> <head> <title>1.1实例:购物车</title> <meta charset="utf-8"> <script src="../angular.js"></script> <script src="

angular学习笔记(八)

本篇介绍angular控制视图的显示和隐藏: 通过给元素添加ng-show属性或者ng-hide属性来控制视图的显示或隐藏: ng-show: 绑定的数据值为true时,显示元素,值为false时,隐藏元素 ng-hide: 绑定的数据值为true时,隐藏元素,值为false时,显示元素 (其实只要用到其中一个就可以了) 下面来看个简单的例子,点击按钮可以显示/隐藏元素: <!DOCTYPE html> <html ng-app> <head> <title>

angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入angular-resource.min.js文件 2.在模块中依赖ngResourece,在服务中注入$resource var HttpREST = angular.module('HttpREST',['ngResource']); HttpREST.factory('cardResource

angular学习笔记(五)-阶乘计算实例(1)

<!DOCTYPE html> <html ng-app> <head> <title>2.3.2计算阶乘实例1</title> <meta charset="utf-8"> <script src="../angular.js"></script> <script src="script.js"></script> </

angular学习笔记(二十三)-$http(1)-api

之前说到的$http.get和$http.post,都是基于$http的快捷方式.下面来说说完整的$http: $http(config) $http接受一个json格式的参数config: config的格式如下: { method:字符串 , url:字符串, params:json对象, data:请求数据, headers:请求头, transformRequest:函数,转换post请求的数据的格式, transformResponse:函数,转换响应到的数据的格式, cache:布尔

angular学习笔记(二十七)-$http(5)-使用$http构建RESTful架构

在angular中有一个特别为RESTful架构而定制的服务,是在$http的基础上进行了封装. 但是为了学习,我们先看看用直接$http是如何构建RESTful架构的: 假设有一个银行卡的列表.需要的功能有: 可以通过id来获取用户123的指定id的卡     'GET'  'card/user/123/id' 可以获取用户123的所有的银行卡             'GET'  'card/user/123' 可以更新用户123的指定id的卡                'POST' '

angular学习笔记(九)-css类和样式3

再来看一个选择li列表的例子: 点击li中的任意项,被点击的li高亮显示: <!DOCTYPE html> <html ng-app> <head> <title>6.3css类和样式</title> <meta charset="utf-8"> <script src="../angular.js"></script> <script src="scri

angular学习笔记(九)-css类和样式2

在上一个例子中,元素的类名使用拼接的方法,这样,类名中就不得不带有true或false,并且不易维护,所以,angular使用ng-class属性来控制元素的类名: 我们来看一个小例子,点击error按钮,顶部提示错误框,点击warning按钮,顶部提示警告框. 错误框的类名是.err,警告框的类名是.warn: <!DOCTYPE html> <html ng-app> <head> <title>6.2css类和样式</title> <