Angular Js导航问题

Posted

技术标签:

【中文标题】Angular Js导航问题【英文标题】:Angular Js navigation issue 【发布时间】:2014-09-02 22:19:07 【问题描述】:

我正在尝试实现简单的登录功能并获得

http://errors.angularjs.org/1.2.6/$rootScope/inprog?p0=%24digest

异常。这是什么意思?以及如何在我得到成功响应后导航到主页

我试过了:

$location.path('/home')
$location.path('/home').apply()
$scope.$apply();

还有更多。

如何在整个会话期间创建会话或维护用户详细信息。 这是我的 loginApp 模块代码。

angular.module('loginApp', [])                                                                                 
    .config([                                                                     
    '$httpProvider','$routeProvider', '$locationProvider',                                 
    function ($httpProvider, $routeProvider)   
        $httpProvider.defaults.useXDomain = true;
        delete $httpProvider.defaults.headers.common['X-Requested-With'];

        $routeProvider.when('/login', 
            templateUrl: '/login.html',
            controller: LoginController
        );
        $routeProvider.when('/home', 
            templateUrl: '/home.html',
            controller: LoginController
        );
        $routeProvider.otherwise( redirectTo: '/login' );

        $locationProvider.html5Mode(true); 

                                                                             
])
    .factory('Auth',['$http',
        function($http)
            return 
                login: function(inputs) 
                    return $http.post('API_URL', inputs);
                
             
    ])
    .controller('LoginController',['$scope', '$http', 'Auth', '$location', function($scope, $http, Auth, $location) 
        $scope.loginUser = function() 
            Auth.login(
                email: $scope.login.email,
                Password: $scope.login.password,
                APIkey: 'API_KEY'
            ).success(function(data) 
                if (data.error) 
                    $scope.login.msg  = "Please your username and password";
                 else 
                 //   $rootScope.user = user;
                        $scope.$apply(function()  $location.path("/home"); );
                    $scope.login.msg  = "You are logged in successfully.";
                
            ).error(function(data) 
                 $scope.login.msg  = "Error in Response.";

            );

        ,
      $scope.logout = function() 
          // user is logged out
        //  $rootScope.user = null;
     
    ]);

我的 HTML 代码 login.html

<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en" data-ng-app="loginApp"> <![endif]-->
<!--[if IE 7]>    <html class="no-js lt-ie9 lt-ie8" lang="en" data-ng-app="loginApp"> <![endif]-->
<!--[if IE 8]>    <html class="no-js lt-ie9" lang="en" data-ng-app="loginApp"> <![endif]-->
<!--[if gt IE 8]> <html lang="en" data-ng-app="loginApp"> <![endif]-->
<!--[if !IE]><!--><html data-ng-app="loginApp"> <!--<![endif]-->
  <head>
    <meta charset="UTF-8">
     <!--[if lte IE 8]>
    <script src="JSON/json2.js"></script>
<![endif]-->
    <link type="text/css" rel="stylesheet" href="stylesheets/style.css">
    <!-- Bootstrap styles -->
    <link rel="stylesheet" href="widget/stylesheets/bootstrap.min.css">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  </head>
  <body>
  <div id="wrap">
    <!-- HEADER -->
    <div id="header">
        <ul>
          <li><a href="home.html"><img src="images/home.png" /></a></li> 
          <li><a href="upload.html"><img src="images/upload.png" /></a></li>
          <li><a href="download.html"><img src="images/list.png" /></a></li> 
        </ul>
        <img src="images/logo.png" class="dialogicalogo" /> 
    </div>
    <!-- END HEADER -->
    <!-- CONTENT -->
    <div id="login" data-ng-controller="LoginController">
      <div id="content_header">
        <img src="images/login.png" />
        <h1>User Login</h1>
      </div>
      <form>
        <p> login.msg </p>
        <div>
          <label for="email">Email Address</label>
          <input type="email" id="email" value="email" data-ng-model="login.email" onblur="if(this.value=='') this.value='email';" onfocus="if(this.value=='email') this.value='';" />
        </div>
        <div>
          <label for="password">Password</label><a href="help.html" class="help">[Forgot?]</a>
          <input type="password" id="password" value="Password" data-ng-model="login.password" onblur="if(this.value=='') this.value='Password';" onfocus="if(this.value=='Password') this.value='';" />
        </div>

      </form>
      <a href="#" data-ng-click="loginUser()" class="button blue center">Log in</a>
    <!-- END CONTENT -->
    </div>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="widget/js/angular.min.js" type="text/javascript"></script>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.18/angular-cookies.min.js" type="text/javascript"></script>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.18/angular-route.min.js" type="text/javascript"></script>
    <!-- The jQuery UI widget factory, can be omitted if jQuery UI is already included -->
    <script src="widget/js/jquery.ui.widget.js"></script>

    <script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
    <!-- The main application script -->
    <script src="widget/js/services/auth.js"></script>
    <script src="widget/js/app.js"></script>
    <script src="widget/js/jquery.placeholder.js"></script>

    <script>
        $(function() 
            // Invoke the plugin
            $('input, textarea').placeholder();
        );
    </script>
  </body>
</html> 

【问题讨论】:

一个问题,你在使用 angular-ui-router 吗? 不...但刚才我把 ut 放在我的代码中..它正在抛出 javascript 异常 更新了我的代码..它正在抛出 javascript 异常 还有一件事,是否必须包含 标签才能使其工作?我没有将它包含在我的 HTML 中 是的,这是强制性的...否则视图将显示在哪里?? 【参考方案1】:

几件事。在您的控制器中,您应用了 scope.apply ,这是无关紧要的,不应该在那里使用。其次,如果未应用 scope.apply,您的 location.path 将起作用 更新:$routeParams 依赖应该包含在 $location 依赖之前

.controller('LoginController',['$scope', '$http', 'Auth', '$routeParams','$location',function($scope, $http, Auth,$routeParams, $location) 
        $scope.loginUser = function() 
            Auth.login(
                email: $scope.login.email,
                Password: $scope.login.password,
                APIkey: 'API_KEY'
            ).success(function(data) 
                if (data.error) 
                    $scope.login.msg  = "Please your username and password";
                 else 
                 //   $rootScope.user = user;
                 // No Apply method required
  //$scope.$apply(function()  
                 $location.path("/home");
                 $scope.login.msg  = "You are logged in successfully.";
             
            ).error(function(data) 
                 $scope.login.msg  = "Error in Response.";

            );

        ,
      $scope.logout = function() 
          // user is logged out
        //  $rootScope.user = null;
     
    ]);

【讨论】:

你需要提供一个 routeProvider 来指定你的控制器和你的路由 url /home 的模板。看看这里docs.angularjs.org/api/ngRoute/provider/$routeProvider 看看 angular-ui-router 以及 github.com/angular-ui/ui-router (我个人的选择,如果应用你可以通过 $state.go('home') 路由到该州并完成。跨度> @user1653773:看到你的紧迫性,得到了一个教程 plunker,它将真正帮助你想象 Angular 是如何工作的:plnkr.co/edit/UkHDqFD8P7tTEqSaCOcc?p=preview希望它对你有帮助 将尝试同时查看上面提供的链接,希望对您有所帮助 好的,谢谢 :)...我正在研究它..如果可能的话,试着找出一些时间来帮助我【参考方案2】:

您可以使用$cookieStore or $cookie 存储登录信息,因此您需要将用户身份验证令牌放入cookie 中。

请查看上面的链接以获取有关如何存储 cookie 的示例。

【讨论】:

你不需要$apply,只需使用$location.path("/home"); 你想看看我的代码吗?我在 Angular JS 中非常陌生..可能是我犯了一些愚蠢的错误。我真的需要一些帮助来实施它。如果您同意,我们可以从团队查看器进行连接。 我也试过了...... $routeprovider 本身正在制造问题,它引发了一些 javascript 异常......我在我的 HTML 中导入了 angular-route.js,除了我必须做任何其他事情来使它工作? 你能设置一个最好的 plunker 吗:) 其实是保密代码..我不能上传到任何地方:(

以上是关于Angular Js导航问题的主要内容,如果未能解决你的问题,请参考以下文章

通过 Angular js 在 index.html 页面中将一个页面导航到另一个页面

为啥 Angular 组件未在浏览器后退/前进导航上加载?

无法直接导航到 URL Angular UI 路由器

Hammer.js 在 Angular 中向左滑动手势动画

改变路线后,Angular 4 JS脚本无法正常工作

导航到混合 Angular 中的另一个组件