javascript – 与AngularJS链接到/未定义的奇怪的

前端之家收集整理的这篇文章主要介绍了javascript – 与AngularJS链接到/未定义的奇怪的前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当使用Codeigniter和AngularJS加载不同的模板时,我有奇怪的问题.当我点击其他链接时,模板将被重定向到某些/未定义的链接.让我告诉你我的代码.

这是我的app.js

var app = angular.module('app',['ngRoute']);
app.config(function($routeProvider){
    $routeProvider.
      when('/',{controller:'homeCtrl',templateUrl:'app/templates/home.html'}).
      when('/home',templateUrl:'app/templates/home.html'}).
      when('/contact',{controller:'contactCtrl',templateUrl:'app/templates/contact.html'}).
      otherwise({ redirectTo: '/home'});
  });

controllers.js

var app = angular.module('app');
    var controllers = {};


controllers.headerCtrl = function($scope,categoriesFactory){ 
    //get available categories
    categoriesFactory.getCategoriesList().success(function(data){
        $scope.categories = data;
    }).error(function(e){
        console.log(e);
    });
}

controllers.homeCtrl = function($scope,productsFactory){
    productsFactory.getlatestProductsList(16).success(function(data){
        $scope.products = data;
    }).error(function(e){
        console.log(e);
    });
}

controllers.contactCtrl = function($scope,$http,$location){ 
    //Send message
    // creating a blank object to hold our form information.
    //$scope will allow this to pass between controller and view
    $scope.formData = {};
    // submission message doesn't show when page loads
    $scope.submission = false;
    // Updated code thanks to Yotam
    var param = function(data) {
        var returnString = '';
        for (d in data){
            if (data.hasOwnProperty(d))
                returnString += d + '=' + data[d] + '&';
        }
        // Remove last ampersand and return
        return returnString.slice( 0,returnString.length - 1 );
    };
    $scope.submitForm = function(){
        $scope.submissionMessage = '';
        $http({
            method : 'POST',url : $location.protocol() + '://' + $location.host() + '/server/contact/send_message',data : param($scope.formData),// pass in data as strings
            // set the headers so angular passing info as form data (not request payload)
            headers : { 'Content-Type': 'application/x-www-form-urlencoded' }
        }).success(function(data){
                if(!data.success){
                    var name = document.getElementById('Name').value;
                    var email = document.getElementById('email').value;
                    var subject = document.getElementById('subject').value;
                    var message = document.getElementById('message').value;
                    if(name.length == '' && email.length == '' && subject.length == '' && message.length == ''){
                        $scope.submissionMessage = data.messageError;
                    }
                    // if not successful,bind errors to error variables
                    $scope.errorName = data.errors.name;
                    $scope.errorEmail = data.errors.email;
                    $scope.errorSubject = data.errors.subject;
                    $scope.errorTextarea = data.errors.message;
                    $scope.submission = true; //shows the error message
                }else{
                    // if successful,bind success message to message
                    $scope.submissionMessage = data.messageSuccess;
                    $scope.formData = {}; // form fields are emptied with this line
                    $scope.submission = true; //shows the success message
                    $scope.errorName = '';
                    $scope.errorEmail = '';
                    $scope.errorSubject = '';
                    $scope.errorTextarea = '';
                }
        });
    };
}
app.controller(controllers);

Factorys.js

var app = angular.module('app');

//Factory for categories
app.factory('categoriesFactory',['$http','$location',function($http,$location){
    var factory = {};

    factory.getCategoriesList = function(){
        return $http.get($location.protocol() + '://' + $location.host() + '/server/api/categories');
    }

    return factory;
}]);

//Factory for products
app.factory('productsFactory',$location){
    var factory = {};
    /*
    factory.getProductsList = function(){
        return $http.get($location.protocol() + '://' + $location.host() + '/server/api/products');
    }
    */
    factory.getlatestProductsList = function($n){
        return $http.get($location.protocol() + '://' + $location.host() + '/server/api/products/latest/'+$n);
    }

    return factory;
}]);

我的HTML index.html

<!DOCTYPE html>
    <html ng-app="app">
    <!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
    <!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
    <!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
    <!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
    <head>
        <Meta charset="utf-8">
        <Meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <title>Trade inside europe</title>
        <Meta name="description" content="">
        <Meta name="viewport" content="width=device-width">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
        <link rel="stylesheet" href="css/icomoon-social.css">
        <link href='http://fonts.googleapis.com/css?family=Open+Sans:400,700,600,800' rel='stylesheet' type='text/css'>
        <link rel="stylesheet" href="css/leaflet.css" />
        <!--[if lte IE 8]>
        <link rel="stylesheet" href="css/leaflet.ie.css" />
        <![endif]-->
        <link rel="stylesheet" href="css/main.css" />
        <script src="js/modernizr-2.6.2-respond-1.1.0.min.js"></script>
    </head>
    <body>

    <!-- Navigation & logo-->
    <div class="mainmenu-wrapper" ng-controller="headerCtrl">
        <div class="container">
            <nav id="mainmenu" class="mainmenu">
                <ul>
                    <li class="logo-wrapper"><a ng-href="#/home" target="_self"><img src="img/mPurpose-logo.png" alt="Multipurpose Twitter Bootstrap Template"></a></li>
                    <li class="active">
                        <a ng-href="#/home" target="_self">Home</a>
                    </li>
                    <li class="has-submenu">
                        <a href="#">Trade +</a>
                        <div class="mainmenu-submenu">
                            <div class="mainmenu-submenu-inner">
                                <div ng-repeat="c in categories track by $index">
                                    <h4 ng-if="c.parent == 0">{{c.category}}</h4>
                                    <ul ng-repeat="sub_c in categories track by $index">
                                        <li ng-if="sub_c.parent == c.id_category">
                                            <a href="#">{{sub_c.category}}</a>
                                        </li>
                                    </ul>
                                </div>
                            </div><!-- /mainmenu-submenu-inner -->
                        </div><!-- /mainmenu-submenu -->
                    </li>
                    <li>
                        <a ng-href="#/contact">Contact</a>
                    </li>
                </ul>
            </nav>
        </div>
    </div>

    <div ng-view></div>

    <!-- Footer -->
    <div class="footer">
        <!-- Footer content -->
    </div>
</div>
<!-- Javascripts -->
<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
<script>window.jQuery || document.write('<script src="http://code.jquery.com/jquery-2.1.4.min.js"><\/script>')</script>
<script src="http://cdn.leafletjs.com/leaflet-0.5.1/leaflet.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script src="js/jquery.fitvids.js"></script>
<script src="js/jquery.sequence-min.js"></script>
<script src="js/jquery.bxslider.js"></script>
<script src="js/main-menu.js"></script>
<script src="js/template.js"></script>
<script src="https://code.angularjs.org/1.4.8/angular.js"></script>
<script src="https://code.angularjs.org/1.4.8/angular-resource.js"></script>
<script src="https://code.angularjs.org/1.4.8/angular-route.js"></script>
<script src="app/app.js"></script>
<script src="app/controllers.js"></script>
<script src="app/factorys.js"></script>
</body>
</html>

home.html的

<div class="section">
    <div class="container">
        <h2>Latest added</h2>
        <div class="row">
            <div class="col-md-3 col-sm-6" ng-repeat="p in products track by $index">
                <div class="portfolio-item">
                    <div class="portfolio-image">
                        <a href="page-portfolio-item.html"><img src="#" alt="#"></a>
                    </div>
                    <div class="portfolio-info">
                        <ul>
                            <li class="portfolio-project-name">{{p.name}}</li>
                            <li>{{p.description | limitTo:100}}<span ng-if="p.description.length > 100 ">...</span></li>
                            <li class="read-more"><a href="page-portfolio-item.html" class="btn">Read more</a></li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

Contact.html

<div class="section section-breadcrumbs">
    <div class="container">
        <div class="row">
            <div class="col-md-6">
                <h1>Contact Us</h1>
            </div>
        </div>
    </div>
</div>

<div class="section">
    <div class="container">
        <div class="row">
        <!-- contact content -->
        </div>
    </div>
</div>

主menu.js

var mainMenu = (function() {

    var $listItems = $( '#mainmenu > ul > li' ),$menuItems = $listItems.children( 'a' ),$body = $( 'body' ),current = -1;
    function init() {
        $menuItems.on( 'click',open );
        $listItems.on( 'click',function( event ) { event.stopPropagation(); } );
    }
    function open( event ) {
        var $item = $( event.currentTarget ).parent( 'li.has-submenu' ),idx = $item.index();
        if($item.length != 0){
            if( current !== -1 ) {
                $listItems.eq( current ).removeClass( 'mainmenu-open' );
            }
            if( current === idx ) {
                $item.removeClass( 'mainmenu-open' );
                current = -1;
            }
            else {
                $item.addClass( 'mainmenu-open' );
                current = idx;
                $body.off( 'click' ).on( 'click',close );
            }
            return false;
        }
        else window.location = $item.find('a').attr('href');
    }
    function close( event ) {
        $listItems.eq( current ).removeClass( 'mainmenu-open' );
        current = -1;
    }
    return { init : init };
})();

那么会发生什么我访问我的home_page(www.mypage.com),并通过链接www.mypage.com/#/正确地呈现页面呈现.
然后我点击在菜单中说联系人按钮,我被重定向http://mypage.com/undefined提供404网站.
如果我按下浏览器上的按钮,我将被重定向到www.mypage.com/#/contact和页面呈现正确

Nginx.logs

==> /var/log/Nginx/error.log <==
2016/01/06 12:24:46 [error] 11852#0: *142 open() "/var/www/html/testapp.com/public_html/undefined" Failed (2: No such file or directory),client: 127.0.0.1,server: testapp.com,request: "GET /undefined HTTP/1.1",host: "testapp.com",referrer: "http://testapp.com/"

==> /var/log/Nginx/access.log <==
127.0.0.1 - - [06/Jan/2016:12:24:46 +0100] "GET /undefined HTTP/1.1" 404 200 "http://testapp.com/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/47.0.2526.80 Safari/537.36"

图片说明:
第一步打开主页

第二步点击按钮联系

第三步按下按钮

点击另一个按钮,就像家里一​​样

发生什么事?

如果您需要任何其他信息,请告诉我,我会提供.
先谢谢你

解决方法

我怀疑你的问题是main-menu.js.
...
else window.location = $item.find('a').attr('href');
...

您的“联系人”链接

<li>
    <a ng-href="#/contact">Contact</a>
</li>

a没有href属性,所以它会做:

window.location = 'undefined';

尝试添加href =“#/ contact”到您的联系人链接.

我认为,当您按下“返回”按钮时,Angular是自举的客户端,这就是当您再次按“返回”时,行为不会发生的原因.

TLDR;更改< a ng-href =“#/ contact”>联系人< / a>到< a ng-href =“#/ contact”href =“#/ contact”>联系人< / a&gt ;.

猜你在找的JavaScript相关文章