【问题标题】:Angular + jquery ui sortableAngular + jquery ui 可排序
【发布时间】:2018-06-26 17:14:09
【问题描述】:

看看这个小提琴https://jsfiddle.net/Lj0swckj/3/

我已经创建了可排序的指令 对于父 div 可排序工作正常 我希望孩子们也能得到同样的东西,并把它作为父母 在给定的示例中,child1、child2、child3 可以交换位置,并且包含 parent1。

我尝试了很多,但找不到任何东西

注意:child1、child2 也可以有子代... (在此示例中,我添加了两个级别的数据,但最多可以是四个级别)

所以我想要一个解决方案,让 sortable 可以适用于这种递归模板。

任何帮助将不胜感激。

angular.module("myApp", []).
controller("myController", ['$scope', function($scope) {
    $scope.fields = [{
    		"name": "parent1",
        "level": 1,
        "children": [{
         		"name": "child1",
            "level": 2
        }, {
        		"name": "child2",
            "level": 2
        }, {
        		"name": "child3",
            "level": 2
        }]
    }, {
    		"name": "parent2",
        "level": 1
    }, {
    		"name": "parent3",
        "level": 1
    }];
    
    $scope.draggableItemsOption = {
    	"moverElement": ".moverBtn",
			"containment": ".draggable-field"
    }
}]).directive("myDragDrop", ['$timeout', function ($timeout) {

		return {
			restrict:'A',
			scope: {
				myDragDrop:"="
			},
			link: function ($scope, element, attrs) {
				var options = $scope.myDragDrop;
				var $container = element;
			
				
				var sortableOptions = {
        	 /* handle: options.moverElement, */
           containment: options.containment,
           delay: 0
				 };


				if($container.sortable){
					$container.sortable(sortableOptions);
				}
				
       }
       }
					
	}]);
.element {
   border: 1px solid #333;
   padding: 10px 10px;
   position: relative;
}

.element-class {
  margin-left: 20px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.20/angular.min.js"></script>
<div ng-app="myApp" ng-controller="myController">
    
    <div class="draggable-field" my-drag-drop="draggableItemsOption">
        <div ng-repeat="data in fields">
            <div class="element" ng-class="{'element-class': data.level > 1}"> 
              {{data.name}}
              <div ng-repeat="childData in data.children">
                  <div class="element" ng-class="{'element-class': data.level > 1}"> 
                    {{childData.name}}
                   </div>
              </div>
           </div>
   			</div>
    </div>
</div>

【问题讨论】:

    标签: angularjs jquery-ui angularjs-directive jquery-ui-sortable jquery-ui-autocomplete


    【解决方案1】:

    嗯!终于有办法了。 其实很简单

    看看这个小提琴https://jsfiddle.net/Lj0swckj/6/ 我所做的是创建子元素

    angular.module("myApp", []).
    controller("myController", ['$scope', function($scope) {
        $scope.fields = [{
        		"name": "parent1",
            "level": 1,
            "children": [{
             		"name": "child1",
                "level": 2
            }, {
            		"name": "child2",
                "level": 2
            }, {
            		"name": "child3",
                "level": 2,
                "children": [{
                		"name": "grandChild1",
                    "level": 3
                }, {
                		"name": "grandChild2",
                    "level": 3
                }]
            }]
        }, {
        		"name": "parent2",
            "level": 1,
            "children": [{
            	"name": "child4",
              "level":2
            }]
        }, {
        		"name": "parent3",
            "level": 1
        }];
        
        $scope.draggableItemsOption = {
        	"moverElement": ".moverBtn",
    			"containment": ".draggable-field"
        }
        
        $scope.childDraggableItemsOption = {
        		"containment": "parent"
        }
    }]).directive("myDragDrop", ['$timeout', function ($timeout) {
    
    		return {
    			restrict:'A',
    			scope: {
    				myDragDrop:"="
    			},
    			link: function ($scope, element, attrs) {
    
    				var options = $scope.myDragDrop;
    				var $container = element;
    			
    				
    				var sortableOptions = {
            	 /* handle: options.moverElement, */
               containment: options.containment,
               delay: 0
    				 };
    
    
    				if($container.sortable){
    					$container.sortable(sortableOptions);
    				}
    				
           }
           }
    					
    	}]);
    .element {
       border: 1px solid #333;
       padding: 10px 10px;
       position: relative;
    }
    
    .element-class {
      margin-left: 20px;
    }
    
    .moverBtn {
      position: absolute;
      top: 2px;
      right: 10px;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-autocomplete/1.0.7/jquery.auto-complete.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.7/angular.min.js"></script>
    
    <div ng-app="myApp" ng-controller="myController">
        <script type="text/ng-template"  id="tree_item_renderer.html">
        <div class="child-draggable-field" my-drag-drop="childDraggableItemsOption">
        		<div ng-repeat="data in data.children" ng-class="{'element-class': data.level > 1}">
       			 	<div class="element"> {{data.name}} ------ {{$parent.$parent.data.children.length}}</div>
              <div ng-include="'tree_item_renderer.html'">
                  </div>
        			</div>
        </div>
    </script>
        <div class="draggable-field" my-drag-drop="draggableItemsOption">
            <div ng-repeat="data in fields">
                <div class="element" ng-class="{'element-class': data.level > 1}"> 
                  {{data.name}}
                  <div ng-include="'tree_item_renderer.html'">
                  </div>
               </div>
       			</div>
        </div>
    </div>

    【讨论】:

      猜你喜欢
      • 2019-09-30
      • 1970-01-01
      • 2017-01-16
      • 2011-02-18
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      相关资源
      最近更新 更多