recherche

Maison  >  Questions et réponses  >  le corps du texte

angulaire.js - Comment la liaison de répétition d'instruction personnalisée angulaire ne peut-elle pas être appliquée au même élément en même temps?

Comme mentionné, j'ai écrit deux instructions. Je souhaite les appliquer au même élément. Effectuez d'abord une répétition, puis reliez. Cependant, actuellement, seule la première exécute bind
<🎜. >

<!DOCTYPE html>
<html lang="zh-cn">
<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">
    <p ng-controller="test">
            <input type="text" ng-model="msg">
            <p lxc-bind="msg" lxc-reapeat="3">123123</p>
            <!-- <p lxc-reapeat="3">lxc</p> -->
    </p>
    <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>
PHP中文网PHP中文网2790 Il y a quelques jours584

répondre à tous(1)je répondrai

  • 迷茫

    迷茫2017-05-15 17:10:02

    Premier point, la méthode clone clone uniquement les nœuds et les événements liés ne seront pas clonés.
    Deuxième point, lors de l'ajout dynamique de nœuds à un document, la directive angulaire ne prendra pas effet et nécessite une compilation dynamique.

    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);
                }
            }
        }
    })
    

    Rendu :

    et ng-repeat

    L'implémentation ci-dessus n'a aucun problème fonctionnel, mais la formation n'est pas très unifiée. J'ai donc fait une légère modification

    <!DOCTYPE html>
    <html lang="zh-cn">
    <head>
        <meta charset="UTF-8">
        <title>angular</title>
        <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script> 
    </head>
    <body ng-app="app">
        <p ng-controller="test">
            <p ng-repeat="i in [1,2,3]">{{i}}</p>
            <input type="text" ng-model="msg">
            <p lxc-bind="msg" lxc-reapeat="3">123123</p>
        </p>
        <script>
            angular.module('app',[])
            .controller('test',function($scope){
                $scope.msg = 'test';
            })
            .directive('lxcBind',function(){
                return {
                    restrict: 'A',
                    link: function($scope, iElm, iAttrs, controller) {
                        console.log(2)
                        $scope.$watch(iAttrs.lxcBind,function(newValue){
                            iElm.text(newValue);
                        })
                    }
                };
            })
            .directive('lxcReapeat',function($compile){
                return {
                    restrict:'A',
                    priority: 1000,
                    link: function(scope, iElement, iAttrs, controller){
                        
                        var repeatNum = iAttrs.lxcReapeat,
                            $parent = iElement.parent(),
                            html = '';
    
                        iElement.remove();
    
                        for (var i = 0; i < repeatNum; i++){
                            if( i == 0 ){
                                html = '<!-- lxcReapeat: '+repeatNum+' -->';
                            }else{
                                html = '<!-- end lxcReapeat: '+repeatNum+' -->';
                            }
                            var dom = iElement.clone()[0];
                            dom.removeAttribute('lxc-reapeat');
                            dom = $compile(html+dom.outerHTML)(scope);
                            $parent.append(dom);
                            dom.attr('lxc-reapeat', repeatNum).addClass('lxc-bind');
                        }
    
                        $parent.append(html);
                        
                    }
                }
            })
        </script>
    </body>
    </html>

    Comparaison finale

    请采纳.

    répondre
    0
  • Annulerrépondre