Using Isotope with AngularJS (ng-repeat)

后端 未结 2 1882
甜味超标
甜味超标 2020-12-24 00:33

I\'m trying to use angular to load div\'s to supply to isotope for layouting. For some reason, I can\'t use ng-repeat to create the div\'s. When I do something like, it wo

相关标签:
2条回答
  • 2020-12-24 01:00

    Try $watching the list variable (cards), and whenever it changes re-apply the isotope. I think your problem is isotope is running before the ng-repeat is filled in.

    Quick example:

    scope.$watch(attrs.ngModel, function() {
      elm.isotope();
    });
    
    0 讨论(0)
  • 2020-12-24 01:19

    I implemented something similar using a masonry directive + ng-animate for enter/leave animations, here's a CSS animation only demo (with chrome vendor prefixed CSS):

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

    The directive:

    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");
                                    });
                                });
                            });
                        }
                    });
                };
            }
        };
    })
    
    0 讨论(0)
提交回复
热议问题