0

所以我试图将这个jquery 插件实现为一个 gwtquery 插件。

我正在使用Draggable。大多数代码在 Gwtquery 中很容易实现,但我看到有两个问题区域 1. 事件处理方式:在 jquery 中,事件只是传递给函数,这里是它们声明可拖动的地方: _rotator.draggable({ helper: 'clone', revert: false, start: function (e) { e.stopPropagation(); e.stopImmediatePropagation();

      // Element Width & Height()
      dims = {
        'w': _this.width(),
        'h': _this.height()
      };

      // Center Coords
      center_coords = {
        'x': _this.offset().left + _this.width() * 0.5,
        'y': _this.offset().top + _this.height() * 0.5
      };
    },
    drag: function (e) {
      var mouse_coords, angle;

      e.stopPropagation();
      e.stopImmediatePropagation();

      _this.rotating = true;

      // Mouse Coords
      mouse_coords = {
        'x': e.pageX,
        'y': e.pageY
      };

这里也需要注意的是暗淡???因为它宣布了什么仍然无法弄清楚。但是代码清楚地停止传播一定很重要相同的代码不能真正以这种方式实现,因为对事件的访问不存在

这是我的代码

 DraggableOptions dragOpts = new DraggableOptions();
            dragOpts.setHelper(HelperType.CLONE);
           dragOpts.setRevert(RevertOption.NEVER);
           dragOpts.setOnDragStart(new DragFunction(){
            @Override
            public void f(DragContext context) {

       centerCoords.setX(context.getDraggable().getOffsetLeft()    +    context.getDraggable().getOffsetWidth());
                centerCoords.setY(context.getDraggable().getOffsetTop() +     context.getDraggable().getOffsetTop());
            }});
        dragOpts.setOnDrag(new DragFunction(){

            @Override
            public void f(DragContext context) {
                final  Coordinate mouseCoords = GWT.create(Coordinate.class);
                Double angle;
                $(_this).mousemove(new Function(){
                    @Override
                    public boolean f(Event e){

                        mouseCoords.setX(e.getClientX());
                        mouseCoords.setY( e.getClientY());

                        return true;
                    }
                });

                angle = radToDeg(getAngle(mouseCoords, centerCoords)) - 90;

                rotate(angle);

            }});
        dragOpts.setOnDragStop(new DragFunction(){

            @Override
            public void f(DragContext context) {
                _this.rotating = false;

            }});


        $(rotator).as(Draggable).draggable(dragOpts );

DragContext 不授予对该事件的访问权限。如果我实现 HandlerManager 它将无法访问局部变量。所以我的答案是破解我可以访问事件的 mousemove 函数。同样,此代码仅在 chrome 中触发一次,而在 ff 中则根本不触发

那么我应该如何实施呢?

4

1 回答 1

0

如果你想绑定你自己的 mousemove 事件处理程序,你应该在 setOndragStart() 方法中进行,并将所有逻辑(角度计算 + 调用旋转函数)放在处理程序本身中。

否则,您应该能够提供自己的 DragAndDropManager 实现,并找到一种与此类共享变量的方法。

于 2014-07-29T09:20:53.237 回答