搜索

首页  >  问答  >  正文

angular 自定义指令 repeat bind 怎么不能同时作用在同一元素上

如题,自己写了两个指令,想作用在同意元素下,先进行repeat,后进行bind,但目前,仅第一个执行bind

731242666-58084e5c257ab_articlex.png

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>angular</title>
    <script src="http://cdn.bootcss.com/angular.js/1.2.10/angular.min.js"></script>
</head>
<body ng-app="app">
    <div ng-controller="test">
            <input type="text" ng-model="msg">
            <div lxc-bind="msg" lxc-reapeat="3">123123</div>
            <!-- <div lxc-reapeat="3">lxc</div> -->
    </div>
    <script>
        angular.module('app',[])
        .controller('test',function($scope){
                $scope.msg = 'test';
        })
        .directive('lxcBind',function(){
            // Runs during compile
            return {
                restrict: 'A', // E = Element, A = Attribute, C = Class, M = Comment
                link: function($scope, iElm, iAttrs, controller) {
                        $scope.$watch(iAttrs.lxcBind,function(newValue){
                                iElm.text(newValue);
                        })
                }
            };
        })
        .directive('lxcReapeat',function(){
            return {
                restrict:'A',
                priority: 1000,
                link:function($scope,$elm,$attr){
                    var repeatNum = $attr.lxcReapeat;
                    for (var i=repeatNum-2;i>= 0;i--){
                         var dom = $elm.clone();
                         $elm.after(dom);
                    }
                }
            }
        })
    </script>
</body>
</html>


高洛峰高洛峰2924 天前726

全部回复(1)我来回复

  • 三叔

    三叔2016-11-12 15:08:13

    第一点,clone方法只是克隆节点,绑定的事件是不会被克隆的。
    第二点,动态添加节点到文档,angular 指令是不会生效的,需要动态编译。

    angular.module('app',[])
    // 注入 $compile 服务,用来动态编译
    .directive('lxcReapeat',function($compile){
        return {
            restrict:'A',
            priority: 1000,
            link:function($scope,$elm,$attr){
                var repeatNum = $attr.lxcReapeat;
                for (var i=repeatNum-2;i>= 0;i--){
                     var dom = $elm.clone();
                     // 删除 lxc-reapeat 属性,否则动态编译会造成死循环。理解这点很重要
                     dom.removeAttr('lxc-reapeat');
                     // 动态编译并连接到scope
                     var ele = $compile(dom)($scope);
                     $elm.after(ele);
                }
            }
        }
    })

    效果图:

    731242666-58084e5c257ab_articlex.png

    731242666-58084e5c257ab_articlex.png

    与ng-repeat

    731242666-58084e5c257ab_articlex.png

    上面这种实现,功能上没有问题,但是阵型并不是很统一。于是,稍作修改

    
    
    
        
        angular
         
    
    
        
            {{i}}

                     123123
        
  •     

    最终对比

    1671351980-5808e687a89f6_articlex.png

    回复
    0
  • 取消回复