【问题标题】:How to convert jQuery code into usable AngularJS code如何将 jQuery 代码转换为可用的 AngularJS 代码
【发布时间】:2014-10-15 05:30:10
【问题描述】:

我是 AngularJS 的新手,想为登录页面创建类似于单击“忘记密码”链接时在此处找到的功能:

http://bootsnipp.com/snippets/featured/login-amp-password-reminder#comments

最好使用指令,因为这是行为,而不是控制器?我已经尝试为它创建一个控制器,但是当我搜索有关该主题的帮助时,我发现为此使用控制器可能不是要走的路。这是我最新的试验,但没有成功(点击链接时没有任何作用):

在 js 文件中的控制器端:

angular.module('mean.users')
    .controller('SwitcherCtrl', ['$document',
        function($document) {
        $document.ready(function () {
            $document.getElementById('olvidado').click(function (e) {
                e.preventDefault();
                $document.getElementById('form-olvidado').toggle('500');
            });
            $document.getElementById('acceso').click(function (e) {
                e.preventDefault();
                $document.getElementById('form-olvidado').toggle('500');
            });
        });
    }
])

在 html 方面,我在必要时包含了 ng-controller="SwitcherCtrl"。

【问题讨论】:

    标签: javascript jquery angularjs controller directive


    【解决方案1】:

    JQuery 方法与 AngularJS 完全不兼容。 DOM 操作只允许在链接函数中的指令中使用,否则这是一种非常糟糕的做法。尝试从头开始,忘记 JQuery。 AngularJS 的神奇之处在于 2-way 绑定。

    您可以使用带有登录控制器和工厂/服务的指令来保存用户名和密码并将其发送到数据库。对于此登录,绝对不需要 JQuery。你可以在这里检查这个问题: AngularJS- Login and Authentication in each route and controller

    编辑:在您上面的问题中,它不是指令而不是控制器。指令可以具有应用于特定范围的控制器。您可以对两者执行相同的操作,但取决于您将重用此登录 sn-p 的次数 - 我想您不需要它,但我相信制作一个仍然是一个好习惯。

    编辑 2:如果你还没有读过这一篇,请看!我相信您会回答有关这两种不同(我会说相反)技术的大部分问题。 "Thinking in AngularJS" if I have a jQuery background? 另外,由于我也是 Jquery 出身,所以我按照这四个资源的顺序,现在我可以做出大部分我想要的东西了:

    编辑 3: 因为我看到对我的回答很感兴趣,所以我决定用要避免的/最佳实践来扩展它,以便代码更易于测试、可维护并且更容易迁移到 Angular 2:

    【讨论】:

    • 当点击链接时,jQuery 和 javascript 被用来使屏幕从“访问帐户”变为“忘记密码”。我的问题与您在我提供的链接中看到的确切功能有关。身份验证与我的问题是分开的,并且已经在工作中。我一直坚持做出我认为非常整洁的行为,您可以在我提供的链接中看到。
    • 是的,忽略身份验证并尝试以该链接完成的方式重建登录。您不应该像当前那样在控制器中进行任何行为和任何 DOM 操作。控制器也不应该有任何状态,这就是为什么您需要工厂/服务来保存它的用户名和密码。控制器只是通过存储库将数据发送到服务器。该示例没有显示这一点,但它是朝着 Angular 构建事物而不是 JQuery 的方式迈出的一大步。
    • 对,在尝试通过搜索谷歌解决我的问题后,我读到它可能属于指令而不是控制器。我想知道如何获得与 jQuery 脚本完全相同的行为,但使用 Angular。我了解其结构的一些基础知识,但我无法弄清楚指令中需要包含哪些代码。总体而言,您的答案似乎更适合登录页面,这就是为什么我没有选择它作为答案的原因。我担心使用 active 和 !active 的另一个答案可能是一种模拟视觉效果的拙劣的方式,而不是实际复制它。
    • 如果我有时间,我明天会尝试从头开始重新创建它:)
    • 我很感激。来自 codeschool 的 Angular 塑造非常有帮助,egghead.io 教程视频是学习更多示例的好方法。谢谢!
    【解决方案2】:

    你可以试试这个,它使用指令和 html。登录或忘记用户名的显示与指令链接函数中范围变量的状态相关。

    Fiddle

    <div ng-app="myApp">
    
        <div my-auth>
    
            <div ng-show="active">
                <form name="login">
                    <input type="email" ng-model="email" placeholder="your@email.com" required />
                    <input type="password" ng-model="passwd" required />
                    <button ng-disabled="!login.$valid">Login</button>
                </form>
                <a href="#" ng-click="toggle()">forgot password?</a>
            </div>
    
            <div ng-show="!active">
                <form name="forgot">
                    <input type="email" ng-model="email" placeholder="your@email.com" required />
                    <button ng-disabled="!forgot.$valid">Reset Password</button>
                </form>
                <a href="#" ng-click="toggle()">access</a>
            </div>
        </div>
    </div> 
    

    指令

    angular.module('myApp', [])
    .directive('myAuth', function(){
        return {
            link: function(scope, elem, attr){
               scope.active = true;
               scope.toggle = function(){
                   scope.active = !scope.active;
               };
            }
        };
    });
    

    【讨论】:

    • 我会试一试,让你知道会发生什么......谢谢!
    【解决方案3】:

    感谢所有回答的人。他们以正确的方向开始了这件事,我能够对其进行改进以得出如下所示的确切答案。

    HTML:

    <div ng-controller="SwitcherCtrl">
        <div data-fold-toggle="active">
            <form id="login">
                <input type="email" ng-model="email" required="">
                <input type="password" ng-model="password" required="">
                <button type="submit">Login</button>
                <a ng-click="active=!active">Forgot your password?</a>
            </form>
        </div>
        <div data-fold-toggle="active" style="display: none;">
            <form id="forgotpw">
                <input type="email" ng-model="email" required="">
                <button type="submit">Reset Password</button>
                <a ng-click="active=!active">Account Access</a>
            </form>
        </div>
    </div>
    

    控制器和指令:

    .controller('SwitcherCtrl', function($scope) {
        $scope.active = true;
    })
    .directive('foldToggle', function() {
        return {
            restrict: 'A',
            scope:{
                isOpen: '=foldToggle'
            },
            link: function(scope, element) {
    
                scope.$watch('isOpen', function(newVal,oldVal){
                    if(newVal !== oldVal){
                        element.toggle(200);
                    }
                });
            }
        };
    });
    

    【讨论】:

      猜你喜欢
      • 2018-12-13
      • 2022-12-02
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 2019-06-28
      • 2019-11-30
      • 2016-04-09
      • 2012-03-20
      相关资源
      最近更新 更多