动态生成的网格无法在 Angular 2 打字稿中拖动

Posted

技术标签:

【中文标题】动态生成的网格无法在 Angular 2 打字稿中拖动【英文标题】:Dynamically generated grid could not be draggable in angular 2 typescript 【发布时间】:2016-12-07 14:35:42 【问题描述】:

//在打字稿文件中使用这个

      jQuery(function() 
            // initialize Packery
            var $grid = jQuery('.grid').packery(
                itemSelector: '.grid-item',
                // columnWidth helps with drop positioning
                columnWidth: 100,
                rowHeight: 100
            );

            // make all items draggable
            var $items = $grid.find('.grid-item').draggable();
            // bind drag events to Packery
            $grid.packery('bindUIDraggableEvents', $items);
        );

//在html文件中使用这个

         <div class="grid">   
     <div *ngFor=" let box of gridJSON " class="grid-item grid-item--width2 grid-item--height2"  ></div>
    </div>      

//为此工作正常

      <div class="grid">   
         <div  class="grid-item grid-item--width2 grid-item--height2"  ></div>
     <div  class="grid-item grid-item--width2 grid-item--height2"  ></div>
        </div>

//不适合这个

     <div class="grid">   
         <div *ngFor=" let box of gridJSON " class="grid-item grid-item--width2 grid-item--height2"  ></div>
        </div>

当我静态放置网格时,可拖动功能工作正常,但是当我使用 *ngFor 创建网格时,它不起作用。

【问题讨论】:

因为你实现的可拖动行为是错误的。你是怎么做到的? 因为它不起作用? 请帮帮我,如何使用相同的可拖动插件为动态网格实现可拖动组件。 packery.metafizzy.co/draggable.html 你能用代码更新你的答案吗,不要在 cmets 中发布它们,它不可读。 【参考方案1】:

在你的组件中设置一个私有变量:

private packery: any;

在 ngOnInit() 中调用 initGrid 函数(如下所述),如下所示:

ngOnInit()            
   setTimeout(() => this.initGrid(), 0);

setTimeout 将等待您的 html 中的 ngFor 完成生成您的 div 网格项。

initGrid 方法:

initGrid() 
        let elem = document.querySelector('.grid');
        this.packery= new Packery(elem, 
            itemSelector: '.grid-item',
            gutter: 10,
            columnWidth: 250
        );

        var elems = this.packery.getItemElements();
        elems.forEach(gridItem => 
            var draggie = new Draggabilly(gridItem);
            // bind drag events to Packery
            this.packery.bindDraggabillyEvents(draggie);
        );
    

如果你不喜欢 initGrid,我认为你可以将你的函数包装在一个 setTimeout 方法中。

希望对你有帮助。

【讨论】:

以上是关于动态生成的网格无法在 Angular 2 打字稿中拖动的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 - 如何在打字稿中使用 FileReader 从给定的 URL 读取文件?

打字稿中@符号的含义--Angular 2

如何将点击事件添加到打字稿中动态添加的html元素

如何将对象数组转换为在打字稿中具有动态键的单个对象

MEAN STACK angular 2:从打字稿中的多个api获取数据

从 Angular 2 打字稿中的 HTML 获取复选框值。