angular学习笔记(三十)-指令(3)

这篇主要介绍指令中的templateUrl属性:

templateUrl属性值是一个url路径,路径指向一个html模板,html模板会填充(或替换)指令内容:

比如上一篇文章里的案例,我们把原来的template属性改用为templateUrl属性:

方法一:

html:

<!DOCTYPE html>
<html ng-app = ‘dirAppModule‘>
<head>
  <title>20.2 指令(templateUrl)</title>
  <meta charset="utf-8">
  <script src="angular.js"></script>
  <script src="script.js"></script>
  <style type="text/css">
    *{
      font-family:‘MICROSOFT YAHEI‘;
      font-size:12px
    }
    h3 {
      color: #CB2027;
    }
  </style>
</head>
<body>
<div>
  <cd-hello></cd-hello>
  <div cd-hello></div>
  <div class="cd-hello"></div>
</div>
</body>
</html>

js:

var dirAppModule = angular.module(‘dirAppModule‘,[]);

dirAppModule.directive(‘cdHello‘,function(){
    return {
        restrict:‘EAC‘,
        replace:true,
        templateUrl:‘hello.html‘
    }
});

hello.html:

<h3>hi,code_bunny</h3>

这样得到的结果和使用template:<h3>hi,code_bunny</h3>得到的结果是一致的.

*以这种方式使用templateUrl属性必须在环境中运行,本地文件是不行的.

方法二:

上面这种方式加载模板,在模板文件比较大,加载需要一定时间的情况下,用户可能先看到标识符,等待模板加载完后才看到内容.如果要避免这种情况,可以使用以下方法:

html:

<!DOCTYPE html>
<html ng-app="dirAppModule">
<head>
  <title>20.3指令</title>
  <meta charset="utf-8">
  <script src="../angular.js"></script>
  <script type="text/ng-template" id="hello.html">
    <h3>hi,code_bunny</h3>
  </script>
  <script src="script.js"></script>
</head>
<body>
  <cd-hello></cd-hello>
  <div cd-hello></div>
  <div class="cd-hello"></div>
</body>
</html>

js:

/*20.3 指令 */
var dirAppModule = angular.module(‘dirAppModule‘,[]);
dirAppModule.directive(‘cdHello‘,function(){
    return {
        restrict:‘EAC‘,
        templateUrl:‘hello.html‘,
        replace:true
    }
});

直接在页面里添加一个script标签,script的type属性为:text/ng-template, script的id属性值自己定义,templateUrl的值就是这个script标签的id属性值,比如这个例子中的hello.html

注意这个script标签是不会发送http请求的.

方法三:

html:

<!DOCTYPE html>
<html ng-app="dirAppModule">
<head>
  <title>20.4指令</title>
  <meta charset="utf-8">
  <script src="../angular.js"></script>
  <script src="script.js"></script>
</head>
<body>
  <cd-hello></cd-hello>
  <div cd-hello></div>
  <div class="cd-hello"></div>
</body>
</html>

js:

/*20.4 指令 */
var appModule = angular.module(‘dirAppModule‘, []);
appModule.run(function($templateCache){
    $templateCache.put(‘hello.html‘,‘<h3>hi,code_bunny</h3>‘)
});
appModule.directive(‘cdHello‘,function(){
    return {
        restrict:‘EAC‘,
        templateUrl:‘hello.html‘,
        replace:true
    }
});

说明: 通过angular创建的模块,都有一个run方法,接受一个函数作为参数.该函数会被执行.

$templateCache是angular内置的一个服务,它的put方法用于存放模板.它接受两个参数,第一个参数为模板的名字,也就是templateUrl的值,这里就是hello.html,第二个参数就是html字符串,也就是模板的内容.

这种方法常用于模板内容是通过$http异步获取的.然后将模板放入$templateCache中以便后面使用.

完整代码:https://github.com/OOP-Code-Bunny/angular/tree/master/OREILLY/20.2%20%E6%8C%87%E4%BB%A4

https://github.com/OOP-Code-Bunny/angular/blob/master/OREILLY/20.3%20%E6%8C%87%E4%BB%A4.html

https://github.com/OOP-Code-Bunny/angular/blob/master/OREILLY/20.4%20%E6%8C%87%E4%BB%A4.html

     https://github.com/OOP-Code-Bunny/angular/blob/master/OREILLY/script.js

时间: 2024-10-14 03:24:53

angular学习笔记(三十)-指令(3)的相关文章

angular学习笔记(三十)-指令(5)-link

这篇主要介绍angular指令中的link属性: link:function(scope,iEle,iAttrs,ctrl,linker){ .... } link属性值为一个函数,这个函数有五个参数:scope,iEle,iAttrs,ctrl,linker scope:指令所在的作用域,这个scope和指令定义的scope是一致的.至于指令的scope,会在讲解scope属性的时候详细解释 iEle:指令元素的jqLite封装.(也就是说iEle可以调用angular封装的简版jq的方法和属

angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令

在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指令(5)-link文章也提到了link函数的第五个参数linker. 这篇文章就来讲解一下transclude()方法(linker()方法),是怎么使用的,另外,它也是compile函数的第三个参数,用法一样. 下面就通过自己写一个简易的模拟ngRepeat的指令cbRepeat,来了解linke

angular学习笔记(三十)-指令(7)-compile和link(2)

继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的代码: html: <body> <div ng-controller="compileCtrl"> <level-one> <level-two> <level-three> hello,{{name}} </level-

angular学习笔记(三十)-指令(2)

本篇主要讲解指令中的 restrict属性, replace属性, template属性 这三个属性 一. restrict: 字符串.定义指令在视图中的使用方式,一共有四种使用方式: 1. 元素: E 2. 属性: A 3. 样式类: C 4. 注释: M restrict的值可以是上面四个字母的任意一个或多个的组合. 不指定的话默认为A. 二. replace: 布尔值.是否将指令元素替换,可以有两个值: 1.true: 替换整个使用指令的元素 2.false: 不替换整个使用指令的元素,而

angular学习笔记(三十)-指令(10)-require和controller

本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐directive> <inner‐directive></inner‐directive> </outer‐directive> 这里有两个指令,一个outer-directive指令元素,它里面又有一个inner-directive指令元素. js: app.directiv

angular学习笔记(三十)-指令(1)

之前在 angular学习笔记(十九)-指令修改dom 里面已经简单的提到了angular中的指令,现在来详细的介绍 '指令' 一.指令的创建: dirAppModule.directive('directive-name',function(){ var obj = { restrict:'string', priority:number, template:'string', templateUrl:'string', replace:bool, transclude:bool or str

angular学习笔记(三十)-指令(8)-scope

本篇讲解指令的scope属性: scope属性值可以有三种: 一.scope:false 默认值,这种情况下,指令的作用域就是指令元素当前所在的作用域. 二.scope:true 创建一个继承了父作用域的子作用域,这样,指令可以访问到父作用域里的值,父作用域的属性值一旦被修改,子作用域里相应的属性值也会被修改,但是子作用域里的属性值修改,不会影响到父作用域里的属性值 举个栗子: html: <!DOCTYPE html> <html ng-app="dirAppModule&q

angular学习笔记(三十)-指令(7)-compile和link(3)

本篇接着上一篇来讲解当指令中带有template(templateUrl)时,compile和link的执行顺序: 把上一个例子的代码再进行一些修改: html: <!DOCTYPE html> <html ng-app="dirAppModule"> <head> <title>20.8.2 指令-link和compile</title> <meta charset="utf-8"> <

angular学习笔记(三十)-指令(9)-一个简单的指令示例

学了前面这么多关于指令的知识,现在就用指令来写一个小组件:expander 这个组件的功能就是点击开展菜单,再点击收起菜单: ↑↓点击展开收起 下面来看它的代码: html: <!DOCTYPE html> <html ng-app="expanderModule"> <head> <title>20.9 指令-expander</title> <meta charset="utf-8"> &l