2013-11-22 7 views
5

ng-repeatによって作成された要素をいくつかの列に移動しようとしています。私はディレクティブで正常に実行しましたが、ng-repeatが動作するオブジェクトの配列を並べ替えると問題が発生します。最小の列を検索してその中に要素を挿入するディレクティブは、最小の列を決定できません(おそらく列に要素が残っている可能性があるため)。 私が使用している構造(ディレクティブ/コントローラなど)は最適ではないと思います。角度コードを整理して、自分が望む動作を得る方法を見つけることができません。ng-repeatによって作成されたangularJS要素の移動

ここに私が今持っていることを示すjsFiddleがあります:http://jsfiddle.net/kytXy/6/アイテムが列の中に正しく挿入されているのがわかります。並べ替えを再配置するボタンをクリックすると、再度挿入されません。同じボタンで何回かクリックすると、何が起こるかを見てください。 コメントの付いたアラートを付けて、アイテムの挿入方法や間違った箇所を確認できるようにします。私はまた、何も成功していなくても、再度挿入する前に列を空にしてみました(jsfiddleのコメント付きjs)。ここで

はコードです: HTML:

<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script> 
<div ng-app="myModule"> 
    <div ng-controller="Ctrl" > 
     <button ng-click="predicate = 'id'; reverse=false; setupColumns()">Sort ID</button> 
     <button ng-click="predicate = 'id'; reverse=true; setupColumns()">Sort ID reversed</button> 
     <div id="columns" generate-sub-columns post-render> 
     </div> 
     <div class="elements"> 
      Elements are stored here ! 
     <div class="element" ng-repeat="(key,elt) in elts | orderBy:predicate:reverse" id="element{{key}}"> 
      Text: {{elt.a}} 
     </div> 
     </div> 
    </div> 
</div> 

JS:

var myModule = angular.module('myModule', []); 

myModule.controller('Ctrl', function($scope) { 
    $scope.predicate='id'; 
    $scope.reverse=false; 

    $scope.elts = [ 
     {id:0,a:"Hi man !"}, 
     {id:1,a:"This is some text"}, 
     {id:2,a:"Wanted to say hello."}, 
     {id:3,a:"Hello World!"}, 
     {id:4,a:"I love potatoes :)"}, 
     {id:5,a:"Don't know what to say now. Maybe I'll just put some long text"}, 
     {id:6,a:"Example"}, 
     {id:7,a:"Example2"}, 
     {id:8,a:"Example3"}, 
     {id:9,a:"Example4"}, 
     {id:10,a:"Example5"}, 
     {id:11,a:"Example6"} 
    ]; 

    $scope.setupColumns = function() { 
     console.log('calling setupColumns'); 
     var eltIndex = 0; 
     var element = jQuery("#element0"); 
     /*while(element.length > 0) { 
      jQuery('#elements').append(element); 
      eltIndex++; 
      element = jQuery("#element"+eltIndex); 
      alert(1); 
     } 
     alert('Columns should be empty');*/ 
     element = jQuery("#element0"); 
     eltIndex = 0; 
     var columnCount = 0; 
     while (jQuery("#column"+columnCount).size() >0) 
      columnCount++; 
     while(element.length > 0) { 
      console.log('placing new element'); 
      var smallestColumn = 0; 
      var smallestSize = jQuery("#columns").height(); 
      for (var i = 0; i < columnCount; i++) { 
       var columnSize = jQuery(".column#column"+i).height(); 
       if (columnSize < smallestSize) { 
        smallestColumn = i; 
        smallestSize = columnSize; 
       } 
      }; 
      jQuery('.column#column'+smallestColumn).append(element); 
      eltIndex++; 
      element = jQuery("#element"+eltIndex); 
      //alert(1); 
     } 
     //alert('Columns should be filled'); 
    }; 
}); 

myModule.directive('generateSubColumns', function() { 
    return { 
     restrict: 'A', 
     controller: function() { 
      var availableWidth = jQuery("#columns").width(); 
      var sizePerColumn = 100; 
      var nbColumns = Math.floor(availableWidth/sizePerColumn); 
      if (nbColumns<=1) 
       nbColumns=1; 
      for (var i = 0; i < nbColumns; i++) { 
       jQuery('<div class="column" id="column'+i+'">Column '+i+'</div>').appendTo('#columns'); 
      }; 
     } 
    }; 
}); 

myModule.directive('postRender', [ '$timeout', function($timeout) { 
    var def = { 
     restrict: 'A', 
     terminal: true, 
     transclude: true, 
     link: function(scope, element, attrs) { 
      $timeout(scope.setupColumns, 0); 
     } 
    }; 
    return def; 
}]); 

と、いくつかのCSS:

#columns { 
    width: 100%; 
} 

.column { 
    width: 100px; 
    display:inline-block; 
    vertical-align: top; 
    border: 1px solid black; 
} 

.element { 
    border: 1px solid red; 
} 

は、私はそれをどのように修正することができますか? ありがとうございます。 hilnius

答えて

0

まず、このようなことをしていますか?

var element = jQuery("#element0"); 

コントローラ内には? そのようなコード(DOM操作)はlink functionディレクティブの中に入り、$elementパラメータを使用してDOM要素にアクセスする必要があります。

また、column-countプロパティを使用してコンテナを分割するとどうなりますか? https://developer.mozilla.org/es/docs/Web/CSS/column-count

関連する問題