2013-04-14 8 views
5

Có cách nào để triển khai Quicksand plugin của jQuery trong Góc không? Có lẽ có một thực hiện nhưng tôi dường như không thể tìm thấy nó.AngularJS Quicksand

Có lẽ một chiến lược để làm điều đó sẽ giúp tôi bởi vì cát lún mất danh sách và sau đó nhận được như một tham số danh sách mới, nhưng với cách tái hiện dữ liệu của Angular tôi không có ý tưởng làm thế nào để làm điều đó.

+0

như với bất kỳ plugin thao tác DOM nào khác, cần phải khởi chạy nó trong chỉ thị góc. Quấn mã của bạn trong '$ timeout' nếu góc sẽ tạo các phần tử' LI' như với 'ng-repeat' – charlietfl

+0

@charlietfl, cái gì? – arg20

+1

'what' là gì? – charlietfl

Trả lời

8

tôi thực hiện một cái gì đó tương tự như sử dụng một nề chỉ thị + ng-Animate cho nhập/rời khỏi hình ảnh động, đây là một hình ảnh động CSS chỉ demo (với nhà cung cấp chrome tiền tố CSS):

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

Chỉ thị:

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

Chỉ thị tuyệt vời! – arg20

+0

Đó là khá trơn. Tôi đang làm việc với một ví dụ phức tạp hơn, nơi có LI bên trong của container (mà cũng là một LI) và có một vấn đề với các hình ảnh động được áp dụng cho tất cả các hậu duệ. Sửa lỗi của tôi là thay đổi 'var itemSelector = type +": không ([class $ = '- left-active']) ";' thành 'var itemSelector = '.masonry>' + type +": not ([class $ = '-leave-active']) ";' – Kywillis

0

Bạn cần thêm directive để thực hiện việc này.

Vì vậy, chỉ với jQuery, bạn phải:

JS

$('#source').quicksand($('#destination li')); 

HTML

<ul id="source"> 
    <li data-id="iphone">iOS</li> 
    <li data-id="android">Android</li> 
    <li data-id="winmo">Windows Phone 7</li> 
</ul> 

<ul id="destination" class="hidden"> 
    <li data-id="macosx">Mac OS X</li> 
    <li data-id="macos9">Mac OS 9</li> 
    <li data-id="iphone">iOS</li> 
</ul> 

Với góc bạn có thể làm:

JS

yourApp.directive('jqQuicksand', function(){ 
    var linkFn = function(scope,element,attrs){ 
     // element here = $(this) 
     // bind your plugin or events (click, hover etc.) here 
     element.quicksand($(attrs.jqQuicksand)); 
    } 

    return { 
     restrict:'A', 
     scope: {}, 
     link: linkFn 
    } 
}); 

HTML

<ul data-jq-quicksand="#destination li" id="source"> 
    <li data-id="iphone">iOS</li> 
    <li data-id="android">Android</li> 
    <li data-id="winmo">Windows Phone 7</li> 
</ul> 

<ul id="destination" class="hidden"> 
    <li data-id="macosx">Mac OS X</li> 
    <li data-id="macos9">Mac OS 9</li> 
    <li data-id="iphone">iOS</li> 
</ul> 

Lưu ý, đây là chưa được kiểm tra nhưng phải ok.