2012-08-10 8 views
16

Ich versuche Winkel zu laden Divs zu Isotope für Layout zu liefern. Aus irgendeinem Grund kann ich nicht ng-repeat verwenden, um die Divs zu erstellen. Wenn ich so etwas tun, es funktioniert gut:Verwenden von Isotope mit AngularJS (ng-repeat)

[agg.html]

<div class="mygrid" iso-grid> 
    <div class="item">myitem</div> 
</div> 

[controlers.js]

module.directive('isoGrid', function() { 
    return function (scope, element, attrs) { 
     element.isotope({ 
      itemSelector: '.item' 
     }); 
    }; 
}); 

module.controller('aggViewport', ['$scope', '$location', function ($scope, $location) { 
    $scope.cards = [{ 
     "ID": "myid", 
     "class": "cardListTile", 
     "badge": "1" 
    } { 
     "ID": "myid2", 
     "class": "cardListTile", 
     "badge": "2" 
    }] 
}]); 

Während die oben ok funktioniert, wenn ich versuche, ng zu verwenden -repeat von eckig scheinen die divs unsichtbar zu werden (sie sind in der dom, aber ich kann sie nicht sehen). Ich habe versucht, Isotope ('reloadItems') und Isotope ('reLayout') zu nennen, aber es scheint nicht zu helfen.

[agg.html]

<div class="mygrid" iso-grid ng-repeat="card in cards"> 
    <div class="item">myitem</div> 
</div> 

Wie kann ich ng-repeat benutzen?

+1

Um diese Art von Problemen zu vermeiden, habe ich ein natives AngularJS-Äquivalent zum jQuery-Isotop geschrieben, siehe dazu: http://tristanguigue.github.io/angular-dynamic-layout – Tristan

Antwort

22

Versuchen Sie $ beobachten die Liste Variable (Karten), und wann immer es sich ändert das Isotop erneut anwenden. Ich denke, Ihr Problem ist Isotop ausgeführt wird, bevor das ng-Repeat in gefüllt ist

Schnell Beispiel:.

scope.$watch(attrs.ngModel, function() { 
    elm.isotope(); 
}); 
+3

Was ist das attrs.ngModel? – CMCDragonkai

+2

Dies ist der Bereichswert des ng-model-Attributs, das in html angegeben ist. Siehe -scope unter Directive Definition Object [hier] (http://docs.angularjs.org/guide/directive) –

10

ich etwas ähnliches mit einem Mauerwerk Richtlinie umgesetzt + ng-belebten für Animationen geben/verläßt, ist hier eine CSS-Animation nur Demo (mit Chrom-Anbieter voran CSS):

http://jsfiddle.net/g/3SH7a/

Die Richtlinie:

angular.module('app', []) 
.directive("masonry", function() { 
    var NGREPEAT_SOURCE_RE = '<!-- ngRepeat: ((.*) in ((.*?)(track by (.*))?)) -->'; 
    return { 
     compile: function(element, attrs) { 
      // auto add animation to brick element 
      var animation = attrs.ngAnimate || "'masonry'"; 
      var $brick = element.children(); 
      $brick.attr("ng-animate", animation); 

      // generate item selector (exclude leaving items) 
      var type = $brick.prop('tagName'); 
      var itemSelector = type+":not([class$='-leave-active'])"; 

      return function (scope, element, attrs) { 
       var options = angular.extend({ 
        itemSelector: itemSelector 
       }, attrs.masonry); 

       // try to infer model from ngRepeat 
       if (!options.model) { 
        var ngRepeatMatch = element.html().match(NGREPEAT_SOURCE_RE); 
        if (ngRepeatMatch) { 
         options.model = ngRepeatMatch[4]; 
        } 
       } 

       // initial animation 
       element.addClass('masonry'); 

       // Wait inside directives to render 
       setTimeout(function() { 
        element.masonry(options); 

        element.on("$destroy", function() { 
         element.masonry('destroy') 
        }); 

        if (options.model) { 
         scope.$apply(function() { 
          scope.$watchCollection(options.model, function (_new, _old) { 
           if(_new == _old) return; 

           // Wait inside directives to render 
           setTimeout(function() { 
            element.masonry("reload"); 
           }); 
          }); 
         }); 
        } 
       }); 
      }; 
     } 
    }; 
}) 
Verwandte Themen