使用templateUrl获取模板

有些时候,Directive中的模板template会变得很大,如果仍然放置在定义中,那么可能会造成阅读和修改不方便的情况。

针对这种情况,我们可以将template替换为templateUrl,通过引入外部文件的形式来调用布局。

例如:

  1. var App = angular.module("App", []);
  2. App.directive("formDirective", function () {
  3. return {
  4. restrict: "A",
  5. scope: {
  6. },
  7. templateUrl:"part.html"
  8. }
  9. });
  10. App.controller("FirstCtrl", function ($scope) {
  11. });
  1. <!DOCTYPE html>
  2. <html lang="zh" ng-app="App">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>{{"学习AngularJS 1.x"}}</title>
  6. <link href="css/style.css" rel="stylesheet">
  7. </head>
  8. <body>
  9. <div ng-controller="FirstCtrl">
  10. <div form-directive></div>
  11. </div>
  12. <script type="text/javascript" src="components/angular/angular.js"></script>
  13. <script type="text/javascript" src="js/app.js"></script>
  14. </body>
  15. </html>

同时,我们还要加入一个新的html文档。为了演示,我们将新建的文档放置在和index.html同一个目录,命名为part.html:

  1. <h1>part.html</h1>
  2. <p>这里是part.html中的内容</p>

运行效果:

图5-10 templateUrl的使用

ng-template

除了直接将HTML部件存储为独立的文件,我们也可以直接使用AngularJS提供的ng-template功能。这点在第四章中也有提到,这里是一个新的示例,帮助您对比物理文件和ng-template文件的优先级。

例如:

  1. <!DOCTYPE html>
  2. <html lang="zh" ng-app="App">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>{{"学习AngularJS 1.x"}}</title>
  6. <link href="css/style.css" rel="stylesheet">
  7. </head>
  8. <body>
  9. <!-- 代码片段开始 -->
  10. <script type="text/ng-template" id="part.html">
  11. <h1>通过ng-template封装的part.html</h1>
  12. <p>这里是part.html中的内容</p>
  13. </script>
  14. <!-- 代码片段结束 -->
  15. <div ng-controller="FirstCtrl">
  16. <div form-directive></div>
  17. </div>
  18. <script type="text/javascript" src="components/angular/angular.js"></script>
  19. <script type="text/javascript" src="js/app.js"></script>
  20. </body>
  21. </html>

这里,我们保留了上个例子中的所有文件(包括独立的part.html),对JavaScript也未进行任何修改。

运行效果如下:

图5-11 templateUrl的使用

要使用这个功能,我们需要在<script>标签中,首先声明type="text/ng-template",并给这段代码进行命名,示例代码中的id="part.html"即是这部分HTML代码片段的命名。使用时,直接使用part.html即可。

这样进行封装,与函数封装调用的概念类似。当默认HTML进行展示时,是不会显示这段代码的。而通过id调用后,又可以直接展示出来。

注意:通过示例我们可以看到,文档中的part.html的优先级高于独立的HTML文件。

使用函数获取templateUrl

templateUrl的特性与我们在第四章学习的ng-include类似,也支持通过函数来获取最终的url地址。例如:

  1. App.directive("formDirective", function () {
  2. return {
  3. restrict: "A",
  4. scope: {},
  5. templateUrl: function () {
  6. return "part.html";
  7. }
  8. }
  9. });

运行效果与上面的图片一致,就不重复展示了。