如何为 Freewall jQuery 插件创建 Angular 指令

Posted

技术标签:

【中文标题】如何为 Freewall jQuery 插件创建 Angular 指令【英文标题】:How to create Angular directive for Freewall jQuery Plugin 【发布时间】:2017-11-11 19:23:52 【问题描述】:

我需要在指令中执行一些 jquery,我是 Angular 的新手,我不知道该怎么做。

var temp = "<div class='cell' style='width:widthpx; height: heightpx; background-image: url(i/photo/index.jpg)'></div>";
        var w = 1, html = '', limitItem = 49;
        for (var i = 0; i < limitItem; ++i) 
            w = 200 +  200 * Math.random() << 0;
            html += temp.replace(/\height\/g, 200).replace(/\width\/g, w).replace("index", i + 1);
        
        $("#freewall").html(html);

        var wall = new Freewall("#freewall");
        wall.reset(
            selector: '.cell',
            animate: true,
            cellW: 20,
            cellH: 200,
            onResize: function() 
                wall.fitWidth();
            
        );
        wall.fitWidth();
        // for scroll bar appear;
        $(window).trigger("resize");
        

这是您可以在https://github.com/kombai/freewall 中检查的查询,我需要在角度指令中执行它,或者如果您知道更高效的方式,您可以在这里分享

【问题讨论】:

永远不要使用带角度的 Jquery。强烈推荐。 阅读AngularJS Developer Guide - Creating Custom Directives Angular Material 在不依赖 JQuery 的情况下提供此功能,正如 @Mr_Perfect 所说,这在 Angular 中是不好的做法。 material.angularjs.org/latest/demo/gridList 是的,不要这样做。您的下一个问题将是“为什么我的任何 Angular 绑定都不再工作了?”这将是因为您通过使用$(...).html() 覆盖而破坏了它们。 【参考方案1】:

我不确定您的要求(您是否需要向该指令传递数据或回调?)。但是创建调用第三方插件的指令的一般方法是这样的:

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

app.directive('yourDirective', function () 
    return 
        restrict: 'A',
        link: function (scope, elem, attrs) 
            if (!attrs.id) 
                return;
            

            var temp = "<div class='cell' style='width:widthpx; height: heightpx; background-image: url(i/photo/index.jpg)'></div>";
            var w = 1, html = '', limitItem = 49;
            for (var i = 0; i < limitItem; ++i) 
                w = 200 + 200 * Math.random() << 0;
                html += temp.replace(/\height\/g, 200).replace(/\width\/g, w).replace("index", i + 1);
            
            elem.html(html);

            var wall = new Freewall("#" + attrs.id);
            wall.reset(
                selector: '.cell',
                animate: true,
                cellW: 20,
                cellH: 200,
                onResize: function () 
                    wall.fitWidth();
                
            );
            wall.fitWidth();
            // for scroll bar appear;
            $(window).trigger("resize");
        
    ;
);

<div your-directive id="freewall"></div>

请注意,如 cmets 中所述,如果您以后需要在单元格中添加 Angular 指令,则必须告诉 Angular 编译生成的 html(或者可能使用嵌入)。

【讨论】:

【参考方案2】:
app.directive('theFreewall', function() 
  return function(scope, element, attrs) 
    scope.$on('LastBrick', function(event)
      var wall = new freewall("#freewall");
      wall.reset(
        selector: '.brick',
        animate: true,
        cellW: 200,
        cellH: 'auto',
        onResize: function() 
          wall.fitWidth();
        
      );
      wall.container.find('.brick img').load(function() 
        wall.fitWidth();
      );
    );
  ;
);

欲了解更多信息,请参阅GitHub: FreeWall Issue #142

【讨论】:

以上是关于如何为 Freewall jQuery 插件创建 Angular 指令的主要内容,如果未能解决你的问题,请参考以下文章

如何为jquery插件执行嵌套对象?

如何为 iPhone 创建自定义 Interface Builder 插件?

如何为 Openfire 插件创建我自己的日志记录配置

如何为 Mac OS X 创建苹果邮件插件 [关闭]

jQuery validate:如何为正则表达式验证添加规则?

如何为 jQuery 列表视图中的特定链接创建点击事件。