如何触发控制器方法的angularjs动画? [英] How to trigger an angularjs animation from a controller method?

查看:227
本文介绍了如何触发控制器方法的angularjs动画?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从一个控制器方法触发角的动画。

我想出了,我不太满意(见下文code)的东西。

问题是,我的动画工作,我需要跟踪$范围的状态变量,即 $ scope.shake

  $ scope.signin =功能(formCtrl){
    $ scope.shake = FALSE;
    如果($ scope.credentials){
        signinService.signin($ scope.credentials,功能(状态,memberRole){
                $ scope.shake = FALSE;
                // TODO:需要检查状态?
                如果(状态=== 200){
                    VAR memberType;
                    如果(memberRole ==='ROLE_BASIC_PARENTS'){
                        memberType ='父母';
                    }
                    如果(memberRole ==='ROLE_BASIC_CHILDCARE_WORKER'){
                        memberType ='托儿工作者;
                    }
                    $ rootScope.globals = {
                        memberType:memberType,
                        验证:'OK'
                    }                    $ cookies.globalsMemberType = $ rootScope.globals.memberType;
                    $ cookies.globalsAuthenticated = $ rootScope.globals.authenticated;                    $ state.go(仪表盘,{memberType:memberType});
                }
            },
            功能(){
                $ scope.shake = TRUE;
            });
    }
    其他{
        $ scope.shake = TRUE;
    }
};<形式纳克级={摇:晃动}NAME =formCtrlNG提交=登入(formCtrl)的novalidate>

有人可以请告知一个清洁的解决方案?

编辑1

下面是所要求的CSS code:

  @  -  WebKit的关键帧动摇{
    0%{
        -webkit-变换:translateX(0);
        变换:translateX(0);
    }    12.5%{
        -webkit-变换:translateX(-6px)rotateY(-5deg);
        变换:translateX(-6px)rotateY(-5deg);
    }    37.5%{
        -webkit-变换:translateX(5像素)rotateY(4deg);
        变换:translateX(5像素)rotateY(4deg);
    }    62.5%{
        -webkit-变换:translateX(-3px)rotateY(-2deg);
        变换:translateX(-3px)rotateY(-2deg);
    }    87.5%{
        -webkit-变换:translateX(2像素)rotateY(1deg);
        变换:translateX(2像素)rotateY(1deg);
    }    100%{
        -webkit-变换:translateX(0);
        变换:translateX(0);
    }
}@keyframes动摇{
    0%{
        -webkit-变换:translateX(0);
        变换:translateX(0);
    }    12.5%{
        -webkit-变换:translateX(-6px)rotateY(-5deg);
        变换:translateX(-6px)rotateY(-5deg);
    }    37.5%{
        -webkit-变换:translateX(5像素)rotateY(4deg);
        变换:translateX(5像素)rotateY(4deg);
    }    62.5%{
        -webkit-变换:translateX(-3px)rotateY(-2deg);
        变换:translateX(-3px)rotateY(-2deg);
    }    87.5%{
        -webkit-变换:translateX(2像素)rotateY(1deg);
        变换:translateX(2像素)rotateY(1deg);
    }    100%{
        -webkit-变换:translateX(0);
        变换:translateX(0);
    }
}.shake {
    -webkit-动画:摇400ms的易用性在出;
    动画:摇400ms的易用性在出;
}


解决方案

下面是我最终使用(见下文code)的解决方案。这是Liamnes的提出的解决方案的适应。

  angular.module('登入')
    .controller('SigninCtrl',['$范围,$ rootScope','$饼干','$州','$动画,signinService',函数($范围,$ rootScope,$饼干,$状态,$动画,signinService){        VAR setPersonalInfo =功能(参数){
            返回signinService.setPersonalInfo(param.headers,$ rootScope);
        };
        VAR goToDashboard =功能(memberType){
            $ state.go(仪表盘,{memberType:memberType});
        };
        VAR reportProblem =功能(){
            $ scope.formCtrl.username $ setValidity('username.wrong',虚假)。
            $ scope.formCtrl.password $ setValidity('password.wrong',虚假)。
            。$ $范围广播('SIGNIN_ERROR');
        };
        VAR resetForm =功能(formCtrl){
            formCtrl.username $ setValidity('username.wrong',真)。
            。formCtrl.password $ setValidity('password.wrong',真);
        };        $ scope.signin =功能(formCtrl){            resetForm(formCtrl);            如果(formCtrl $有效){
                signinService.signin($scope.credentials).then(setPersonalInfo).then(goToDashboard).catch(reportProblem);
            }
            其他{
                。$ $范围广播('SIGNIN_ERROR');
            }
        }
    }])
    .directive('shakeThat',['$动画',函数($动画){
        返回{
            要求:'^形式,
            范围: {
                登入:'和;'
            },
            链接:功能(范围,元素,ATTRS,形式){
                范围。在('SIGNIN_ERROR'$,函数(){
                    $ animate.addClass(元素,'摇'),然后(函数(){
                        $ animate.removeClass(元素,'摇');
                    });
                });
            }
        };
    }]);

HTML

 <形式换血那名=formCtrlNG提交=登入(formCtrl)的novalidate>

I would like to trigger an angular animation from a controller method.

I have come up with something that I am not satisfied with (see code below).

The issue is that for my animation to work, I need to track the state of a $scope variable i.e. $scope.shake:

$scope.signin = function (formCtrl) {
    $scope.shake = false;
    if ($scope.credentials) {
        signinService.signin($scope.credentials, function (status, memberRole) {
                $scope.shake = false;
                //TODO: necessary to check status?
                if (status === 200) {
                    var memberType;
                    if (memberRole === 'ROLE_BASIC_PARENTS') {
                        memberType = 'parents';
                    }
                    if (memberRole === 'ROLE_BASIC_CHILDCARE_WORKER') {
                        memberType = 'childcare-worker';
                    }
                    $rootScope.globals = {
                        memberType: memberType,
                        authenticated: 'OK'
                    }

                    $cookies.globalsMemberType = $rootScope.globals.memberType;
                    $cookies.globalsAuthenticated = $rootScope.globals.authenticated;

                    $state.go('dashboard', {memberType: memberType});
                }
            },
            function () {
                $scope.shake = true;
            });
    }
    else {
        $scope.shake = true;
    }
};

<form ng-class="{shake: shake}" name="formCtrl" ng-submit="signin(formCtrl)" novalidate>

Can someone please advise a cleaner solution?

edit 1:

Here is the css code as requested:

@-webkit-keyframes shake {
    0% {
        -webkit-transform: translateX(0);
        transform: translateX(0);
    }

    12.5% {
        -webkit-transform: translateX(-6px) rotateY(-5deg);
        transform: translateX(-6px) rotateY(-5deg);
    }

    37.5% {
        -webkit-transform: translateX(5px) rotateY(4deg);
        transform: translateX(5px) rotateY(4deg);
    }

    62.5% {
        -webkit-transform: translateX(-3px) rotateY(-2deg);
        transform: translateX(-3px) rotateY(-2deg);
    }

    87.5% {
        -webkit-transform: translateX(2px) rotateY(1deg);
        transform: translateX(2px) rotateY(1deg);
    }

    100% {
        -webkit-transform: translateX(0);
        transform: translateX(0);
    }
}

@keyframes shake {
    0% {
        -webkit-transform: translateX(0);
        transform: translateX(0);
    }

    12.5% {
        -webkit-transform: translateX(-6px) rotateY(-5deg);
        transform: translateX(-6px) rotateY(-5deg);
    }

    37.5% {
        -webkit-transform: translateX(5px) rotateY(4deg);
        transform: translateX(5px) rotateY(4deg);
    }

    62.5% {
        -webkit-transform: translateX(-3px) rotateY(-2deg);
        transform: translateX(-3px) rotateY(-2deg);
    }

    87.5% {
        -webkit-transform: translateX(2px) rotateY(1deg);
        transform: translateX(2px) rotateY(1deg);
    }

    100% {
        -webkit-transform: translateX(0);
        transform: translateX(0);
    }
}

.shake {
    -webkit-animation: shake 400ms ease-in-out;
    animation: shake 400ms ease-in-out;
}

解决方案

Here is the solution I ended up using (see code below). It is an adaptation of Liamnes's proposed solution.

angular.module('signin')
    .controller('SigninCtrl', ['$scope', '$rootScope', '$cookies', '$state', '$animate', 'signinService', function ($scope, $rootScope, $cookies, $state, $animate, signinService) {

        var setPersonalInfo = function (param) {
            return signinService.setPersonalInfo(param.headers, $rootScope);
        };
        var goToDashboard = function (memberType) {
            $state.go('dashboard', {memberType: memberType});
        };
        var reportProblem = function () {
            $scope.formCtrl.username.$setValidity('username.wrong', false);
            $scope.formCtrl.password.$setValidity('password.wrong', false);
            $scope.$broadcast('SIGNIN_ERROR');
        };
        var resetForm = function(formCtrl){
            formCtrl.username.$setValidity('username.wrong', true);
            formCtrl.password.$setValidity('password.wrong', true);
        };

        $scope.signin = function (formCtrl) {

            resetForm(formCtrl);

            if (formCtrl.$valid) {
                signinService.signin($scope.credentials).then(setPersonalInfo).then(goToDashboard).catch(reportProblem);
            }
            else {
                $scope.$broadcast('SIGNIN_ERROR');
            }
        }
    }])
    .directive('shakeThat', ['$animate', function ($animate) {
        return {
            require: '^form',
            scope: {
                signin: '&'
            },
            link: function (scope, element, attrs, form) {
                scope.$on('SIGNIN_ERROR', function () {
                    $animate.addClass(element, 'shake').then(function () {
                        $animate.removeClass(element, 'shake');
                    });
                });
            }
        };
    }]);

HTML:

<form shake-that name="formCtrl" ng-submit="signin(formCtrl)" novalidate>

这篇关于如何触发控制器方法的angularjs动画?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆