2013-11-22 10 views
5

Sto provando a spostare elementi creati da una ng-repeat in alcune colonne. L'ho fatto con successo con una direttiva, ma il problema si verifica quando ordino l'array di oggetti su cui opera ng-repeat. La direttiva che cerca la colonna più piccola e quindi inserisce l'elemento in essa non riesce a determinare la colonna più piccola (forse perché ci sono ancora elementi nelle colonne). Credo che la struttura che uso (direttive/controller ecc ...) non sia ottimale, e non riesco a trovare come organizzare il codice angolare per ottenere il comportamento che voglio.Spostamento di elementi angolariJS creati da ng-repeat

Ecco un jsFiddle che mostra quello che ho ora: http://jsfiddle.net/kytXy/6/ Si può vedere che gli elementi vengono inseriti correttamente all'interno delle colonne. Se fai clic su un pulsante che riordina l'ordinamento, non vengono più inseriti. Se fai clic più volte su uno stesso pulsante, guarda cosa succede ... Inserisco avvisi commentati che puoi rimuovere dal commento in modo da poter vedere come vengono inseriti gli articoli e cosa è sbagliato. Ho anche provato a svuotare le colonne prima di inserirle di nuovo (commento js nel jsfiddle), senza alcun successo.

Ecco il codice: 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; 
}]); 

e alcuni css:

#columns { 
    width: 100%; 
} 

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

.element { 
    border: 1px solid red; 
} 

Come posso rimediare? Grazie in anticipo, hilnius

risposta

0

Primo .. Perché stai facendo qualcosa del genere?

var element = jQuery("#element0"); 

All'interno di un controller? Questo tipo di codice (manipolazione DOM) dovrebbe andare all'interno della direttiva della funzione di collegamento e utilizzare il parametro $element per accedere all'elemento DOM.

Inoltre .. Cosa succede se si utilizza la proprietà column-count per dividere il contenitore? https://developer.mozilla.org/es/docs/Web/CSS/column-count

Problemi correlati