返回介绍

基本的自定义方法

发布于 2024-12-24 22:41:42 字数 6882 浏览 0 评论 0 收藏 0

18.3. 基本的自定义方法

自定义一个指令可以非常非常的复杂,但是其基本的调用形式,同自定义服务大概是相同的:

  <p show style="font-size: 12px;"></p>

  <script type="text/javascript">

  var app = angular.module('Demo', [], angular.noop);

  app.directive('show', function(){
    var func = function($scope, $element, $attrs){
      console.log($scope);
      console.log($element);
      console.log($attrs);
    }    
    return func;
    //return {compile: function(){return func} }
  });

  angular.bootstrap(document, ['Demo']);
  </script>

如果在 directive 中直接返回一个函数,则这个函数会作为 compile 的返回值,也即是作为 link 函数使用。这里说的 compilelink 都是一个指令的组成部分,一个完整的定义应该返回一个对象,这个对象包括了多个属性:

  • name
  • priority
  • terminal
  • scope
  • controller
  • require
  • restrict
  • template
  • templateUrl
  • replace
  • transclude
  • compile
  • link

上面的每一个属性,都可以单独探讨的。

下面是一个完整的基本的指令定义例子:

  <code lines>
  //失去焦点使用 jQuery 的扩展支持冒泡
  app.directive('ngBlur', function($parse){
    return function($scope, $element, $attr){
      var fn = $parse($attr['ngBlur']);
      $element.on('focusout', function(event){
        fn($scope, {$event: event});
      });
    }
  });
  </code>

  <div code lines>
  //失去焦点使用 jQuery 的扩展支持冒泡
  app.directive('ngBlur', function($parse){
    return function($scope, $element, $attr){
      var fn = $parse($attr['ngBlur']);
      $element.on('focusout', function(event){
        fn($scope, {$event: event});
      });
    }
  });
  </div>
 1   var app = angular.module('Demo', [], angular.noop);
 2   
 3   app.directive('code', function(){
 4     var func = function($scope, $element, $attrs){
 5   
 6       var html = $element.text();
 7       var lines = html.split('\n');
 8   
 9       //处理首尾空白
10       if(lines[0] == ''){lines = lines.slice(1, lines.length - 1)}
11       if(lines[lines.length-1] == ''){lines = lines.slice(0, lines.length - 1)}
12   
13       $element.empty();
14   
15       //处理外框
16       (function(){
17         $element.css('clear', 'both');
18         $element.css('display', 'block');
19         $element.css('line-height', '20px');
20         $element.css('height', '200px');
21       })();
22   
23       //是否显示行号的选项
24       if('lines' in $attrs){
25         //处理行号
26         (function(){
27           var div = $('<div style="width: %spx; background-color: gray; float: left; text-align: right; padding-right: 5px; margin-right: 10px;"></div>'
28                       .replace('%s', String(lines.length).length * 10));
29           var s = '';
30           angular.forEach(lines, function(_, i){
31             s += '<pre style="margin: 0;">%s</pre>\n'.replace('%s', i + 1);
32           });
33           div.html(s);
34           $element.append(div);
35         })();
36       }
37   
38       //处理内容
39       (function(){
40         var div = $('<div style="float: left;"></div>');
41         var s = '';
42         angular.forEach(lines, function(l){
43           s += '<span style="margin: 0;">%s</span><br />\n'.replace('%s', l.replace(/\s/g, '<span>&nbsp;</span>'));
44         });
45         div.html(s);
46         $element.append(div);
47       })();
48     }
49   
50     return {link: func,
51             restrict: 'AE'}; //以元素或属性的形式使用命令
52   });
53   
54   angular.bootstrap(document, ['Demo']);

上面这个自定义的指令,做的事情就是解析节点中的文本内容,然后修改它,再把生成的新内容填充到节点当中去。其间还涉及了节点属性值 lines 的处理。这算是指令中最简单的一种形式。因为它是“一次性使用”,中间没有变量的处理。比如如果节点原来的文本内容是一个变量引用,类似于 { { code } } ,那上面的代码就不行了。这种情况麻烦得多。后面会讨论。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文