কৌণিক নির্দেশে পুনরাবৃত্তি


178

কয়েকটি জনপ্রিয় পুনরাবৃত্তাকার কৌণিক নির্দেশিকা প্রশ্নোত্তরের বাইরে রয়েছে যা সমস্ত নীচের সমাধানে নেমে আসে:

প্রথমটির একটিতে সমস্যা রয়েছে যে আপনি পূর্ববর্তী সংকলিত কোডটি অপসারণ করতে পারবেন না যদি আপনি বোধগম্যভাবে ম্যানুয়াল সংকলন প্রক্রিয়াটি পরিচালনা না করেন। দ্বিতীয় পদ্ধতির সমস্যাটি রয়েছে ... নির্দেশিকা হয়ে না যাওয়া এবং এর শক্তিশালী ক্ষমতাগুলি হারিয়ে না যাওয়া, তবে আরও জরুরিভাবে, এটি কোনও দিকনির্দেশক হতে পারে ঠিক সেভাবেই প্যারামিটারাইজড করা যায় না; এটি কেবলমাত্র একটি নতুন নিয়ামক উদাহরণে আবদ্ধ।

আমি ম্যানুয়ালি একটি angular.bootstrapবা @compile()লিঙ্ক ফাংশনটিতে খেলছি , কিন্তু এটি আমাকে সরানোর এবং যুক্ত করার জন্য উপাদানগুলির ম্যানুয়ালি রাখার সমস্যাটিতে ফেলেছে।

প্যারামিটারাইজড রিকার্সিভ প্যাটার্ন রাখার কি কোনও ভাল উপায় আছে যা রানটাইম স্থিতি প্রতিস্থাপনের জন্য উপাদানগুলি যোগ / অপসারণ পরিচালনা করে? এর অর্থ হল, একটি অ্যাড / ডিলিট নোড বোতাম সহ এমন একটি গাছ এবং এমন কোনও ইনপুট ক্ষেত্র যার মান নোডের শিশু নোডের নিচে চলে যায়। শৃঙ্খলযুক্ত স্কোপগুলির সাথে সম্ভবত দ্বিতীয় পদ্ধতির সংমিশ্রণ (তবে এটি কীভাবে করব তা আমার কোনও ধারণা নেই)?

উত্তর:


315

থ্রেড @ dnc253 উল্লেখ বর্ণিত সমাধান দ্বারা অনুপ্রাণিত, আমি পুনরাবৃত্তির কার্যকারিতা আনমনা একটি সেবা মধ্যে

module.factory('RecursionHelper', ['$compile', function($compile){
    return {
        /**
         * Manually compiles the element, fixing the recursion loop.
         * @param element
         * @param [link] A post-link function, or an object with function(s) registered via pre and post properties.
         * @returns An object containing the linking functions.
         */
        compile: function(element, link){
            // Normalize the link parameter
            if(angular.isFunction(link)){
                link = { post: link };
            }

            // Break the recursion loop by removing the contents
            var contents = element.contents().remove();
            var compiledContents;
            return {
                pre: (link && link.pre) ? link.pre : null,
                /**
                 * Compiles and re-adds the contents
                 */
                post: function(scope, element){
                    // Compile the contents
                    if(!compiledContents){
                        compiledContents = $compile(contents);
                    }
                    // Re-add the compiled contents to the element
                    compiledContents(scope, function(clone){
                        element.append(clone);
                    });

                    // Call the post-linking function, if any
                    if(link && link.post){
                        link.post.apply(null, arguments);
                    }
                }
            };
        }
    };
}]);

যা নিম্নলিখিত হিসাবে ব্যবহৃত হয়:

module.directive("tree", ["RecursionHelper", function(RecursionHelper) {
    return {
        restrict: "E",
        scope: {family: '='},
        template: 
            '<p>{{ family.name }}</p>'+
            '<ul>' + 
                '<li ng-repeat="child in family.children">' + 
                    '<tree family="child"></tree>' +
                '</li>' +
            '</ul>',
        compile: function(element) {
            // Use the compile function from the RecursionHelper,
            // And return the linking function(s) which it returns
            return RecursionHelper.compile(element);
        }
    };
}]);

একটি ডেমো জন্য এই Plunker দেখুন । আমি এই সমাধানটি সবচেয়ে পছন্দ করি কারণ:

  1. আপনার কোনও বিশেষ নির্দেশের দরকার নেই যা আপনার এইচটিএমএলকে আরও পরিষ্কার করে তোলে।
  2. পুনরাবৃত্তি যুক্তিটি পুনরাবৃত্তিহেল্পার পরিষেবাতে বিমূর্ত করা হয়, সুতরাং আপনি আপনার নির্দেশকে পরিষ্কার রাখুন।

আপডেট: কৌণিক 1.5.x হিসাবে, আর ট্রিকগুলির প্রয়োজন নেই, তবে কেবলমাত্র টেমপ্লেট দিয়ে কাজ করে , টেমপ্লেট ইউআরএল দিয়ে নয়


3
ধন্যবাদ, দুর্দান্ত সমাধান! একে অপরের কাজ অন্তর্ভুক্ত দুটি নির্দেশকের মধ্যে পুনরাবৃত্তি করার জন্য সত্যই পরিষ্কার এবং বাক্সটির বাইরে কাজ করেছি।
jssebastian

6
আসল সমস্যাটি হ'ল আপনি যখন পুনরাবৃত্ত নির্দেশাবলী ব্যবহার করেন তখন AngularJS একটি অন্তহীন লুপে যায়। এই কোডটি নির্দেশের সংকলনের ইভেন্টের সময় সামগ্রীগুলি সরিয়ে, এবং নির্দেশনার লিঙ্ক ইভেন্টে সামগ্রীগুলি সংকলন করে এবং পুনরায় যুক্ত করে এই লুপটি ভেঙে দেয়।
মার্ক লেজেনডিজ্ক

15
আপনার উদাহরণে আপনি প্রতিস্থাপন করতে পারে compile: function(element) { return RecursionHelper.compile(element); }সঙ্গে compile: RecursionHelper.compile
পাওলো মোরেটি

1
আপনি যদি টেমপ্লেটটি একটি বাহ্যিক ফাইলে অবস্থিত করতে চান?
কোডিবাগস্টাইন

2
এটি এই অর্থে মার্জিত যে যদি / যখন কৌনিক কোর অনুরূপ সমর্থন প্রয়োগ করে, আপনি কেবলমাত্র কাস্টম সংকলন মোড়কে মুছে ফেলতে পারেন এবং বাকি সমস্ত কোড একই থাকবে।
কার্লো বোনামিকো

25

ম্যানুয়ালি উপাদান যুক্ত করা এবং সেগুলি সংকলন করা অবশ্যই একটি নিখুঁত পদ্ধতির। আপনি যদি এনজি-রিপিট ব্যবহার করেন তবে আপনাকে ম্যানুয়ালি উপাদানগুলি সরিয়ে ফেলতে হবে না।

ডেমো: http://jsfiddle.net/KNM4q/113/

.directive('tree', function ($compile) {
return {
    restrict: 'E',
    terminal: true,
    scope: { val: '=', parentData:'=' },
    link: function (scope, element, attrs) {
        var template = '<span>{{val.text}}</span>';
        template += '<button ng-click="deleteMe()" ng-show="val.text">delete</button>';

        if (angular.isArray(scope.val.items)) {
            template += '<ul class="indent"><li ng-repeat="item in val.items"><tree val="item" parent-data="val.items"></tree></li></ul>';
        }
        scope.deleteMe = function(index) {
            if(scope.parentData) {
                var itemIndex = scope.parentData.indexOf(scope.val);
                scope.parentData.splice(itemIndex,1);
            }
            scope.val = {};
        };
        var newElement = angular.element(template);
        $compile(newElement)(scope);
        element.replaceWith(newElement);
    }
}
});

1
আমি আপনার স্ক্রিপ্ট আপডেট করেছি যাতে এটিতে কেবল একটি নির্দেশ থাকে। jsfiddle.net/KNM4q/103 আমরা কীভাবে ডিলিট বোতামটির কাজটি করতে পারি?
বেনি বোত্তেমা

খুব সুন্দর! আমি খুব ঘনিষ্ঠ ছিল, কিন্তু @position ছিল না (আমি parentData [Val] সঙ্গে এটি খুঁজে পাইনি আপনি (চূড়ান্ত সংস্করণের সাথে আপনার উত্তর আপডেট করে। Jsfiddle.net/KNM4q/111 ) আমি তা গ্রহণ করব।
বেনি বোত্তেমা

12

আপনি সংযুক্ত উদাহরণ বা একই বেসিক ধারণার মধ্যে এই সমাধানটি পাওয়া যায় কিনা তা আমি নিশ্চিতভাবে জানি না তবে আমার পুনরাবৃত্তির দিকনির্দেশনার প্রয়োজন ছিল এবং আমি একটি দুর্দান্ত, সহজ সমাধান খুঁজে পেয়েছি ।

module.directive("recursive", function($compile) {
    return {
        restrict: "EACM",
        priority: 100000,
        compile: function(tElement, tAttr) {
            var contents = tElement.contents().remove();
            var compiledContents;
            return function(scope, iElement, iAttr) {
                if(!compiledContents) {
                    compiledContents = $compile(contents);
                }
                iElement.append(
                    compiledContents(scope, 
                                     function(clone) {
                                         return clone; }));
            };
        }
    };
});

module.directive("tree", function() {
    return {
        scope: {tree: '='},
        template: '<p>{{ tree.text }}</p><ul><li ng-repeat="child in tree.children"><recursive><span tree="child"></span></recursive></li></ul>',
        compile: function() {
            return  function() {
            }
        }
    };
});​

আপনার recursiveনির্দেশিকা তৈরি করা উচিত এবং তারপরে এটিকে উপাদানটির চারপাশে মোড়ানো উচিত যা পুনরাবৃত্তির কল করে।


1
@ মার্কারার এবং @ ডিএনসি 253 এটি সহায়ক, তবে আমি সর্বদা নিম্নলিখিত ত্রুটিটি পাই:[$compile:multidir] Multiple directives [tree, tree] asking for new/isolated scope on: <recursive tree="tree">
জ্যাক

1
অন্য কেউ যদি এই ত্রুটিটি অনুভব করে থাকেন তবে কেবল আপনি (বা ইওম্যান) কোনও জাভাস্ক্রিপ্ট ফাইল একাধিকবার অন্তর্ভুক্ত করেননি। কোনওভাবে আমার main.js ফাইলটি দুবার অন্তর্ভুক্ত ছিল এবং তাই একই নামের দুটি নির্দেশিকা তৈরি করা হয়েছিল। জেএস অন্তর্ভুক্ত সরানোর পরে, কোডটি কাজ করেছিল।
জ্যাক

2
@ জ্যাক এটি নির্দেশ করার জন্য ধন্যবাদ। এই সমস্যাটির শ্যুটিংয়ের জন্য কেবল বেশ কয়েক ঘন্টা সময় ব্যয় করুন এবং আপনার মন্তব্য আমাকে সঠিক দিক নির্দেশ করেছেন। বান্ডিলিং পরিষেবাটি ব্যবহার করছেন এমন এএসপি.এনইটি ব্যবহারকারীদের জন্য, ওয়াইল্ডকার্ড ব্যবহার করার সময় ডিরেক্টরিতে কোনও ফাইলের পুরাতন মিনিফাইন্ড সংস্করণ আপনার নেই এবং তা নিশ্চিত করুন।
বিয়ারস

আমার জন্য, কলব্যাকের অভ্যন্তরে যেমন উপাদান যুক্ত করা প্রয়োজন:। compiledContents(scope,function(clone) { iElement.append(clone); });অন্যদিকে, "প্রয়োজনীয়" এড কন্ট্রোলার সঠিকভাবে পরিচালনা করা হয় না, এবং ত্রুটি: Error: [$compile:ctreq] Controller 'tree', required by directive 'subTreeDirective', can't be found!কারণ।
সুনিও ইয়োশিওকা

আমি কৌনিক জেএস দিয়ে গাছের কাঠামো উত্পন্ন করার চেষ্টা করছি তবে এটির সাথে আটকেছি।
লার্নিং-ওভারথিংকার-বিভ্রান্ত

10

কৌণিক 1.5.x হিসাবে, আর কোনও কৌশল প্রয়োজন নেই, নিম্নলিখিতটি সম্ভব হয়েছে। চারপাশে নোংরা কাজের আর দরকার নেই!

এই আবিষ্কারটি পুনরাবৃত্তির দিকনির্দেশের জন্য আরও ভাল / ক্লিনার সমাধানের জন্য আমার শিকারের পণ্য ছিল। আপনি এটি এখানে পেতে পারেন https://jsfiddle.net/cattails27/5j5au76c/ । এটি এখন পর্যন্ত 1.3.x সমর্থন করে।

angular.element(document).ready(function() {
  angular.module('mainApp', [])
    .controller('mainCtrl', mainCtrl)
    .directive('recurv', recurveDirective);

  angular.bootstrap(document, ['mainApp']);

  function recurveDirective() {
    return {
      template: '<ul><li ng-repeat="t in tree">{{t.sub}}<recurv tree="t.children"></recurv></li></ul>',
      scope: {
        tree: '='
      },
    }
  }

});

  function mainCtrl() {
    this.tree = [{
      title: '1',
      sub: 'coffee',
      children: [{
        title: '2.1',
        sub: 'mocha'
      }, {
        title: '2.2',
        sub: 'latte',
        children: [{
          title: '2.2.1',
          sub: 'iced latte'
        }]
      }, {
        title: '2.3',
        sub: 'expresso'
      }, ]
    }, {
      title: '2',
      sub: 'milk'
    }, {
      title: '3',
      sub: 'tea',
      children: [{
        title: '3.1',
        sub: 'green tea',
        children: [{
          title: '3.1.1',
          sub: 'green coffee',
          children: [{
            title: '3.1.1.1',
            sub: 'green milk',
            children: [{
              title: '3.1.1.1.1',
              sub: 'black tea'
            }]
          }]
        }]
      }]
    }];
  }
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script>
<div>
  <div ng-controller="mainCtrl as vm">
    <recurv tree="vm.tree"></recurv>
  </div>
</div>


1
এর জন্য ধন্যবাদ. আপনি কি আমাকে এই বৈশিষ্ট্যটি প্রবর্তনকারী চেঞ্জলগে লিঙ্ক করতে পারবেন? ধন্যবাদ!
স্টিভেন

কৌণিক 1.5.x ব্যবহার করা খুব গুরুত্বপূর্ণ। 1.4.x কাজ করবে না এবং এটি আসলে jsfiddle এ উপলব্ধ সংস্করণ।
পাইকমান

jsfiddle jsfiddle.net/cattails27/5j5au76c তে এই উত্তরের একই কোড নেই ... এটি কি ঠিক? আমি কি মিস করছি?
পাওলো বিয়াবতী


4

কিছু সময়ের জন্য বেশ কয়েকটি কাজের ব্যবহারের পরে, আমি বারবার এই সমস্যাটিতে ফিরে এসেছি।

আমি পরিষেবা সমাধান দ্বারা সন্তুষ্ট নই যেহেতু এটি নির্দেশের জন্য কাজ করে যা পরিষেবাটি ইনজেক্ট করতে পারে তবে বেনামে টেম্পলেট টুকরাগুলির জন্য কাজ করে না।

একইভাবে, নির্দেশগুলিতে ডিওএম ম্যানিপুলেশন করে নির্দিষ্ট টেম্পলেট কাঠামোর উপর নির্ভর করে এমন সমাধানগুলি খুব নির্দিষ্ট এবং ভঙ্গুর।

আমার বিশ্বাস আমার কাছে একটি জেনেরিক সমাধান যা পুনরাবৃত্তিটিকে তার নিজস্ব নির্দেশিকা হিসাবে গ্রহণ করে যা অন্য কোনও নির্দেশের সাথে ন্যূনতম হস্তক্ষেপ করে এবং বেনামে ব্যবহার করা যেতে পারে।

নীচে একটি বিক্ষোভ রয়েছে যা আপনি plnkr- এর সাথেও চারপাশে খেলতে পারেন: http://plnkr.co/edit/MSiwnDFD81HAOXWvQWIM

var hCollapseDirective = function () {
  return {
    link: function (scope, elem, attrs, ctrl) {
      scope.collapsed = false;
      scope.$watch('collapse', function (collapsed) {
        elem.toggleClass('collapse', !!collapsed);
      });
    },
    scope: {},
    templateUrl: 'collapse.html',
    transclude: true
  }
}

var hRecursiveDirective = function ($compile) {
  return {
    link: function (scope, elem, attrs, ctrl) {
      ctrl.transclude(scope, function (content) {
        elem.after(content);
      });
    },
    controller: function ($element, $transclude) {
      var parent = $element.parent().controller('hRecursive');
      this.transclude = angular.isObject(parent)
        ? parent.transclude
        : $transclude;
    },
    priority: 500,  // ngInclude < hRecursive < ngIf < ngRepeat < ngSwitch
    require: 'hRecursive',
    terminal: true,
    transclude: 'element',
    $$tlb: true  // Hack: allow multiple transclusion (ngRepeat and ngIf)
  }
}

angular.module('h', [])
.directive('hCollapse', hCollapseDirective)
.directive('hRecursive', hRecursiveDirective)
/* Demo CSS */
* { box-sizing: border-box }

html { line-height: 1.4em }

.task h4, .task h5 { margin: 0 }

.task { background-color: white }

.task.collapse {
  max-height: 1.4em;
  overflow: hidden;
}

.task.collapse h4::after {
  content: '...';
}

.task-list {
  padding: 0;
  list-style: none;
}


/* Collapse directive */
.h-collapse-expander {
  background: inherit;
  position: absolute;
  left: .5px;
  padding: 0 .2em;
}

.h-collapse-expander::before {
  content: '•';
}

.h-collapse-item {
  border-left: 1px dotted black;
  padding-left: .5em;
}

.h-collapse-wrapper {
  background: inherit;
  padding-left: .5em;
  position: relative;
}
<!DOCTYPE html>
<html>

  <head>
    <link href="collapse.css" rel="stylesheet" />
    <link href="style.css" rel="stylesheet" />
    <script data-require="angular.js@1.3.15" data-semver="1.3.15" src="https://code.angularjs.org/1.3.15/angular.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js" data-semver="2.1.1" data-require="jquery@*"></script>
    <script src="script.js"></script>
    <script>
      function AppController($scope) {
        $scope.toggleCollapsed = function ($event) {
          $event.preventDefault();
          $event.stopPropagation();
          this.collapsed = !this.collapsed;
        }
        
        $scope.task = {
          name: 'All tasks',
          assignees: ['Citizens'],
          children: [
            {
              name: 'Gardening',
              assignees: ['Gardeners', 'Horticulture Students'],
              children: [
                {
                  name: 'Pull weeds',
                  assignees: ['Weeding Sub-committee']
                }
              ],
            },
            {
              name: 'Cleaning',
              assignees: ['Cleaners', 'Guests']
            }
          ]
        }
      }
      
      angular.module('app', ['h'])
      .controller('AppController', AppController)
    </script>
  </head>

  <body ng-app="app" ng-controller="AppController">
    <h1>Task Application</h1>
    
    <p>This is an AngularJS application that demonstrates a generalized
    recursive templating directive. Use it to quickly produce recursive
    structures in templates.</p>
    
    <p>The recursive directive was developed in order to avoid the need for
    recursive structures to be given their own templates and be explicitly
    self-referential, as would be required with ngInclude. Owing to its high
    priority, it should also be possible to use it for recursive directives
    (directives that have templates which include the directive) that would
    otherwise send the compiler into infinite recursion.</p>
    
    <p>The directive can be used alongside ng-if
    and ng-repeat to create recursive structures without the need for
    additional container elements.</p>
    
    <p>Since the directive does not request a scope (either isolated or not)
    it should not impair reasoning about scope visibility, which continues to
    behave as the template suggests.</p>
    
    <p>Try playing around with the demonstration, below, where the input at
    the top provides a way to modify a scope attribute. Observe how the value
    is visible at all levels.</p>
    
    <p>The collapse directive is included to further demonstrate that the
    recursion can co-exist with other transclusions (not just ngIf, et al)
    and that sibling directives are included on the recursive due to the
    recursion using whole 'element' transclusion.</p>
    
    <label for="volunteer">Citizen name:</label>
    <input id="volunteer" ng-model="you" placeholder="your name">
    <h2>Tasks</h2>
    <ul class="task-list">
      <li class="task" h-collapse h-recursive>
        <h4>{{task.name}}</h4>
        <h5>Volunteers</h5>
        <ul>
          <li ng-repeat="who in task.assignees">{{who}}</li>
          <li>{{you}} (you)</li>
        </ul>
        <ul class="task-list">
          <li h-recursive ng-repeat="task in task.children"></li>
        </ul>
      <li>
    </ul>
    
    <script type="text/ng-template" id="collapse.html">
      <div class="h-collapse-wrapper">
        <a class="h-collapse-expander" href="#" ng-click="collapse = !collapse"></a>
        <div class="h-collapse-item" ng-transclude></div>
      </div>
    </script>
  </body>

</html>


2

এখন যে Angular 2.0 পূর্বরূপে চলেছে আমার মনে হয় মিশ্রণের মধ্যে একটি কৌনিক 2.0 বিকল্প যুক্ত করা ঠিক আছে। অন্তত এটি পরে লোকদের উপকার করবে:

মূল ধারণাটি স্ব-রেফারেন্স সহ একটি পুনরাবৃত্ত টেম্পলেট তৈরি করা:

<ul>
    <li *for="#dir of directories">

        <span><input type="checkbox" [checked]="dir.checked" (click)="dir.check()"    /></span> 
        <span (click)="dir.toggle()">{{ dir.name }}</span>

        <div *if="dir.expanded">
            <ul *for="#file of dir.files">
                {{file}}
            </ul>
            <tree-view [directories]="dir.directories"></tree-view>
        </div>
    </li>
</ul>

তারপরে আপনি কোনও গাছের বস্তুকে টেমপ্লেটে বেঁধে রাখুন এবং পুনরাবৃত্তিটি বাকী অংশগুলির যত্ন নেবেন। এখানে একটি পূর্ণ উদাহরণ রয়েছে: http://www.syntaxsuccess.com/viewarticle/recursive-treeview-in-angular-2.0


2

এর জন্য সত্যিই একটি সহজ কাজ রয়েছে যার জন্য নির্দেশের মোটেই প্রয়োজন হয় না।

ঠিক আছে, সেই দিক থেকে, আপনি যদি নির্দেশনা প্রয়োজন বলে ধরে নেন তবে এটি মূল সমস্যার সমাধানও নয়, তবে আপনি জিইউআইর প্যারাম্যাট্রাইজড সাব-স্ট্রাকচার সহ একটি পুনরাবৃত্ত জিইউআই কাঠামো চাইলে এটি একটি সমাধান। যা সম্ভবত আপনি চান।

সমাধানটি কেবল এনজি-কন্ট্রোলার, এনজি-আর এবং এনজি-অন্তর্ভুক্ত ব্যবহারের উপর ভিত্তি করে। কেবল নিম্নরূপ হিসাবে এটি করুন, ধরে নিন যে আপনার কন্ট্রোলারটিকে "মাইকন্ট্রোলার" বলা হয়, আপনার টেম্পলেটটি MyTemplate.html এ অবস্থিত এবং আপনার কন্ট্রোলারে init নামে একটি আরম্ভকরণ ফাংশন রয়েছে যা আর্গি, এ, বি এবং সি গ্রহণ করে, এটি সম্ভব করে তোলে আপনার নিয়ামককে প্যারামাইট্রাইজ করুন। তারপরে সমাধানটি নিম্নরূপ:

myTemplate.htlm:

<div> 
    <div>Hello</div>
    <div ng-if="some-condition" ng-controller="Controller" ng-init="init(A, B, C)">
       <div ng-include="'myTemplate.html'"></div>
    </div>
</div>

আমি সাধারণ কন্ঠে বিশ্বাস করেছি যে এই ধরণের কাঠামোটি আপনার প্লেইন ভ্যানিলা কৌণিকের মতো পুনরাবৃত্ত হতে পারে। কেবল এই নকশার ধরণটি অনুসরণ করুন এবং আপনি কোনও উন্নত সংকলন টিঙ্কারিং ইত্যাদি ছাড়াই পুনরাবৃত্ত UI- কাঠামো ব্যবহার করতে পারেন

আপনার নিয়ামকের ভিতরে:

$scope.init = function(A, B, C) {
   // Do something with A, B, C
   $scope.D = A + B; // D can be passed on to other controllers in myTemplate.html
} 

কেবলমাত্র খারাপ দিকটিই আমি দেখতে পাচ্ছি হ'ল চ্যালেঞ্জী বাক্য গঠন যা আপনাকে সহ্য করতে হয়।


আমি আশঙ্কা করছি এটি সমস্যার পরিবর্তে মৌলিক উপায়ে সমাধান করতে ব্যর্থ হয়েছে: এই পদ্ধতির সাহায্যে আপনাকে MyTemplate.html- এ পর্যাপ্ত নিয়ামক থাকতে হলে পুনরাবৃত্তির সামনের গভীরতা জানতে হবে
স্টিয়ার্ট_আর

আসলে, আপনি না। যেহেতু আপনার ফাইল myTemplate.html এনজি-অন্তর্ভুক্ত ব্যবহার করে myTemplate.html এর একটি স্ব রেফারেন্স রয়েছে (উপরের এইচটিএমএল বিষয়বস্তু myTemplate.html এর বিষয়বস্তু, সম্ভবত স্পষ্টভাবে বলা হয়নি)। এইভাবে এটি সত্যিকারের পুনরাবৃত্ত হয়ে যায়। আমি উত্পাদন কৌশল ব্যবহার করেছি।
ইরোবউইন

এছাড়াও, সম্ভবত পরিষ্কারভাবে বলা হয়নি যে পুনরাবৃত্তিটি শেষ করতে আপনার কোথাও এনজি-যদি ব্যবহার করা প্রয়োজন। সুতরাং আপনার myTemplate.html আমার মন্তব্যে আপডেট হিসাবে ফর্ম হয়।
ইরোবউইন

0

আপনি এর জন্য কৌণিক-পুনরাবৃত্তি-ইনজেক্টর ব্যবহার করতে পারেন: https://github.com/knyga/angular-recursion-injector

আপনাকে কন্ডিশনার সহ সীমাহীন গভীরতা বাসাতে দেয়। শুধুমাত্র প্রয়োজন হলে পুনরায় সংশ্লেষণ করে এবং কেবল সঠিক উপাদানগুলি সংকলন করে। কোডে কোনও জাদু নেই।

<div class="node">
  <span>{{name}}</span>

  <node--recursion recursion-if="subNode" ng-model="subNode"></node--recursion>
</div>

এমন একটি জিনিস যা এটিকে দ্রুত এবং সহজভাবে কাজ করতে দেয় তার পরে অন্যান্য সমাধানগুলি হ'ল "--recursion" প্রত্যয়।


0

আমি পুনরাবৃত্তির জন্য প্রাথমিক নির্দেশের একটি সেট তৈরি শেষ করেছি up

আইএমও এটি এখানে পাওয়া সমাধানের তুলনায় অনেক বেশি মৌলিক, এবং আরও বেশি না হলে যেমন নমনীয়, তাই আমরা ইউএল / এলআই কাঠামো ইত্যাদি ব্যবহার করতে বাধ্য নই ... তবে স্পষ্টতই তারা ব্যবহার করতে বুদ্ধি বোধ করে, তবে নির্দেশিকাগুলি এ সম্পর্কে অবগত নয় are আসলে ...

একটি দুর্দান্ত সাধারণ উদাহরণটি হ'ল:

<ul dx-start-with="rootNode">
  <li ng-repeat="node in $dxPrior.nodes">
    {{ node.name }}
    <ul dx-connect="node"/>
  </li>
</ul>

'ডিএক্স-স্টার্ট-উইথ' একটি 'ডিএক্স-কানেক্ট' এর বাস্তবায়নটি এখানে পাওয়া যায়: https://github.com/dotJEM/angular-tree

এর অর্থ আপনার যদি 8 টি ভিন্ন লেআউট প্রয়োজন হয় তবে আপনাকে 8 টি নির্দেশিকা তৈরি করতে হবে না।

আপনি যেখানে নোড যুক্ত করতে বা মুছতে পারেন তার উপরে একটি বৃক্ষ-দৃশ্য তৈরি করা বরং সহজ হবে। যেমনটি রয়েছে: http://codepen.io/anon/pen/BjXGbY?editors=1010

angular
  .module('demo', ['dotjem.angular.tree'])
  .controller('AppController', function($window) {

this.rootNode = {
  name: 'root node',
  children: [{
    name: 'child'
  }]
};

this.addNode = function(parent) {
  var name = $window.prompt("Node name: ", "node name here");
  parent.children = parent.children || [];
  parent.children.push({
    name: name
  });
}

this.removeNode = function(parent, child) {
  var index = parent.children.indexOf(child);
  if (index > -1) {
    parent.children.splice(index, 1);
  }
}

  });
<div ng-app="demo" ng-controller="AppController as app">
  HELLO TREE
  <ul dx-start-with="app.rootNode">
<li><button ng-click="app.addNode($dxPrior)">Add</button></li>
<li ng-repeat="node in $dxPrior.children">
  {{ node.name }} 
  <button ng-click="app.removeNode($dxPrior, node)">Remove</button>
  <ul dx-connect="node" />
</li>
  </ul>

  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script>
  <script src="https://rawgit.com/dotJEM/angular-tree-bower/master/dotjem-angular-tree.min.js"></script>

</div>

এই জায়গা থেকে, নিয়ামক এবং টেমপ্লেট এটির নিজের নির্দেশে মোড়ানো যেতে পারে যদি কেউ এটির জন্য আগ্রহী wish

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.