How to trigger an event in AgularJS as in jQuery?

断了今生、忘了曾经 提交于 2021-01-27 05:17:09

问题


Is it possible to do something like $("#container").trigger("click"); using only AngularJS ? And if it's not possible to trigger, is there another way to manage this behavior ?

I have a basic example that creates a box on a button click. The created box is draggable. Now, currently the user has to click on the button (to create the box) and click again to drag the box. I would like the user to simply click once : to create the box and then trigger the drag event of the box so that the user doesn't have to click again.

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

// This directive is attached to the button and makes it create a box every time the is a 'mousedown' event
app.directive("boxCreator", function($document, $compile) {
    return {
        restrict: 'A',
        link: function($scope, $element, $attrs) {
            $element.bind("mousedown", function($event) {
                var newNode = $compile('<div class="box" drag></div>')($scope);

                newNode.css({
                    top: $event.pageY - 25 + "px",
                    left: $event.pageX - 25 + "px"
                    });

                angular.element($document[0].body).append(newNode);
                // I'd like to do something like : '$(newNode).trigger("mousedown");'
            });
        }
    }
});

// Makes the binded element draggable
app.directive("drag", function($document) {
    return function(scope, element, attr) {
        var startX = 0, startY = 0, x = event.pageX - 25, y = event.pageY - 25;

        element.css({
         position: 'absolute',
         cursor: 'pointer'
        });

        element.on('mousedown', function(event) {
          event.preventDefault();
          startX = event.pageX - x;
          startY = event.pageY - y;
          $document.on('mousemove', mousemove);
          $document.on('mouseup', mouseup);
        });

        function mousemove(event) {
          y = event.pageY - startY;
          x = event.pageX - startX;
          element.css({
            top: y + 'px',
            left:  x + 'px'
          });
        }

        function mouseup() {
          $document.off('mousemove', mousemove);
          $document.off('mouseup', mouseup);
        }
      };
    });

JSFIDDLE


回答1:


The documentation you want to look at is angular.element, which is angular's JQLite implementation.

You can see from this that there is a .triggerHandler() method.

So something like:

angular.element(newNode).triggerHandler('mousedown');

Will trigger the handler. The only thing is, this doesn't include any of the event data, so you will also have to remove the dependency on event.pageY. I did this crudely by modifying these two lines:

startX = (event.pageX - x) || 0;
startY = (event.pageY - y) || 0;

You could also look into passing params, but I couldn't get that to work at all.

Hopefully this gets you started.

Updated fiddle




回答2:


You can use a triggerHandler and pass custom event data.

element.triggerHandler({
    type: 'mousedown',
    pageX: 0,
    pageY: 0
});


来源:https://stackoverflow.com/questions/25709041/how-to-trigger-an-event-in-agularjs-as-in-jquery

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!