Angular ngRoute не может получить представление

Я пытаюсь использовать механизм маршрутизации Angular в приложении, однако при нажатии на элемент, который должен вызвать маршрутизацию, я получаю сообщение не может GET viewName, где viewName — это любое представление.

Это мой файл сценария app.js:

var app = angular.module('actsapp', ['ngRoute']);

//Define Routing for app
app.config(['$routeProvider',
   function($routeProvider) {
      $routeProvider
      .when('/', {
            templateUrl: 'views/student_list.html',
            controller: 'StudentListController'
      })
      .when('/Students', {
            templateUrl: 'views/student_list.html',
            controller: 'StudentListController'
      })
      .when('/RegisterStudent', {
            templateUrl: 'views/register_student.html',
            controller: 'StudentRegistrationController'
       });
  }]);

 app.controller('StudentListController', function($scope) {    
    $scope.message = 'This is student list screen';
 });


app.controller('StudentRegistrationController', function($scope) {
    $scope.message = 'This is student registration screen'; 
});

и это мой index.html:

<!DOCTYPE html>
<html ng-app="actsapp">

<head>
    <title></title>
    <link href="style/style.css" rel="stylesheet" />
    <link href="style/bootstrap.css" rel="stylesheet" />

    <script src="scripts/jquery-1.js"></script>
    <script src="scripts/angular/angular.js"></script>
    <script src="scripts/angular/angular-route.js"></script>
    <script src="scripts/angular/app.js"></script>
</head>

<body>
<div class="header">
    <div class="heading_wrap">
        <h1>Student Registration Form</h1>
    </div>
</div>
<div class="nav-wrap">
    <ul class="nav nav-acts-pills nav-stacked ">
        <li class="active">
            <a href="/Students">Student List</a>
        </li>
        <li>
            <a href="/RegisterStudent">Add Student</a>
        </li>
        <li>
            <a>Add Students (By School)</a>
        </li>
    </ul>
</div>

<div ng-view="" class="content-wrap" style="float:left;">
</div>
</body>

</html>

Любые предложения о том, как исправить это, более чем приветствуются. Я основывал свою работу на последней версии документации ngRoute. Спасибо.


person Alan Grixti    schedule 17.10.2014    source источник
comment
Ваш код кажется правильным. На какой системе вы работаете? Angular хотя бы находит контроллер?   -  person teone    schedule 17.10.2014


Ответы (2)


Вам нужно добавить #, как показано ниже, чтобы работать с маршрутизацией:

<li class="active">
    <a href="#/Students">Student List</a>    // add #
</li>
<li>
    <a href="#/RegisterStudent">Add Student</a>    // add #
</li>

А в файле .js templateUrl должно выглядеть так: /views/student_list.html.


Однако, если вам нужны маршруты без #, вам нужно добавить $locationProvider.html5Mode(true);. Посмотрите пример здесь, чтобы узнать, как избежать использования #. Также см. это. Демо говорит, что:

app.config(['$routeProvider',
   function($routeProvider,$locationProvider) {
  $routeProvider
      .when('/', {
        templateUrl: '/views/student_list.html',   // urls should be like this
        controller: 'StudentListController'
      })
      .when('/Students', {
        templateUrl: '/views/student_list.html',  // urls should be like this
        controller: 'StudentListController'
      })
      .when('/RegisterStudent', {
        templateUrl: '/views/register_student.html',     // urls should be like this
        controller: 'StudentRegistrationController'
       });
       $locationProvider.html5Mode(true);
  }]);    ]

В представлении:

    <li class="active">
        <a href="/Students">Student List</a>
    </li>
    <li>
        <a href="/RegisterStudent">Add Student</a>
    </li>  
person Kalhan.Toress    schedule 17.10.2014
comment
Я последовал примеру и внес изменения, однако я продолжаю получать сообщение «Невозможно получить/студенты» всякий раз, когда я нажимаю на элемент href. Любые подсказки приветствуются :) - person Alan Grixti; 17.10.2014
comment
о, вам нужно создать такие URL-адреса /views/student_list.html, я обновлю ответ - person Kalhan.Toress; 17.10.2014
comment
На самом деле проблема была не в этом, $locationProvider в app.config ломал угловой модуль. - person Alan Grixti; 17.10.2014
comment
вы добавили $locationProvider в функцию app.config - person Kalhan.Toress; 17.10.2014
comment
Повторно добавил его. По какой-то странной причине он ломал код. Не мог понять почему. - person Alan Grixti; 17.10.2014
comment
Я не собираюсь говорить, что ты гений, потому что это простая проблема, но ты спас мою задницу. спасибо - person bobleujr; 09.09.2016

У меня такая же проблема. Работая над ним часами, я, наконец, добился своего.

AngularJS разработан на основе концепции SPA (одностраничное приложение). Таким образом, все представления должны быть построены вокруг основного index.html, связанного с ng-приложением. Примечание. Я попытался обойти это, создав два разных имени ng-app, чтобы при ссылке на B.html можно было загрузить ng-app="B", оставив index.html с ng-app= «А» позади. Это не сработало — Angular все еще ищет «A» — за исключением.

Таким образом, вы создаете свой index.html таким образом, что вы либо сохраняете «общую» основную часть сверху или снизу

<ng-view></ng-view>

где часть «иначе» в службе маршрутизации будет размещать представление html по умолчанию, т. Е. Ваше начальное содержимое index.html; или вы помещаете весь контент в отдельный файл представления для загрузки в index.html, например, мой код здесь:

<body ng-app="YouTiming">
    <div ng-controller="Main">
        <ng-view></ng-view>
    </div>
</body> 

Представление по умолчанию, main_view.html, будет иметь содержимое из основного контроллера. Вот роутер:

angular.module("YouTiming", ["customFilter", "ngRoute"])
.config(function ($routeProvider) {
    $routeProvider
    .when("/archive", {
        templateUrl: "/view/archive.html"
    })
    .when("/edit-portfolio", {
        templateUrl: "/view/edit-portfolio.html"
    })
    .otherwise({
        templateUrl: "/view/main_view.html"
    });
});

Затем в main_view.html у меня есть href:

<a ng-href="#/archive">Archive</a>

Обратите внимание, что '#' должен сообщить AngularJS, что я хочу поместить "/view/archive.html" обратно в исходный SPA, о котором он знает до сих пор (поскольку существует только одно ng-приложение). Без '#' вы получите ту же ошибку: Cannot GET /archive

В архиве.html:

<div>
    <div class="col-sm-6">
        123
    </div>
    <div class="col-sm-6">
        456
    </div>
</div>

Окончательный результат:

123                456

Следующий вопрос заключается в том, как вы переключаете представление фокуса между несколькими представлениями в одном и том же SPA. Это следующая проблема, которую я собираюсь решить, но я думаю, вы можете настроить что-то в $scope для переключения представления с помощью ng-show или ng-hide. Если у кого-то есть лучшее предложение, пожалуйста, сообщите, спасибо!

person Daniel C. Deng    schedule 25.10.2014