AngularJS маршрутизация без веб-сервера
Я хочу разработать html5 SPA-приложение для тонкого клиента. На нем нет возможности запустить какой-либо веб-сервер. И я не могу заставить работать маршрутизацию без веб-сервера.
Мой index.html
<!doctype html>
<html ng-app="app">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.min.js"></script>
<script src="app.js"></script>
<title></title>
</head>
<body style="background-color: white;">
<h1>Index</h1>
<a id="link" href="/login">Go to login</a>
<div ng-controller="HomeCtrl">
<ul ng-repeat="number in numbers" >
<li>{{number}}</li>
</ul>
</div>
</body>
</html>
Мой app.js
angular.module('app', []).
config(function($routeProvider) {
$routeProvider.
when('/', {controller: HomeCtrl, templateUrl: 'index.html'}).
when('/login', {controller: LoginCtrl, templateUrl: 'login.html', resolve: function() {}}).
otherwise({redirectTo:'/'});
});
function HomeCtrl($scope) {
$scope.numbers = [1,2,3,4,5];
}
function LoginCtrl($scope) {
}
Я тестирую этот код локально на моем компьютере в Chrome. Привязка данных работает как шарм, но ссылка на страницу входа не работает. Это ведет к {X}:\login. Итак, мои вопросы: возможно ли заставить его работать без нашего веб-сервера? А во-вторых, чего мне не хватает, чтобы это сделать?
5 ответов
Через некоторое время я сделал это работает.
Сначала я переместил этот кусок в отдельный файл
<div ng-controller="HomeCtrl">
<ul ng-repeat="number in numbers" >
<li>{{number}}</li>
</ul>
</div>
Во-вторых, в index.html
Я добавил этот div
<div ng-view></div>
Он используется в качестве заполнителя представления.
Сейчас index.html
используется как "главная страница" или "макет", если вы знакомы с asp.net. При нажатии на ссылку содержимое файла templateUrl вставляется в заполнитель div.
Недостатком этого является то, что URL должен выглядеть следующим образом <a href="#/login"></a>
Вам нужно поместить свои шаблоны в сам index.html, используя теги сценария, чтобы angular больше не нужно было отправлять запросы AJAX для их получения.
<script type="text/ng-template" id="home.html">
This is the content of the template
</script>
Angular - это клиентский JS-фреймворк, поэтому ему не нужен веб-сервер. Помимо добавления ng-view (как вы уже поняли), у ваших ссылок должен быть хеш-бэнг впереди (#/login
), если вы не используете html5mode.
Таким образом, наличие хеш-бэнга в URL-адресах не является недостатком, это вариант.
Вот некоторый код с http://docs.angularjs.org/api/ng. $ Route
// configure html5 to get links working on jsfiddle
$locationProvider.html5Mode(true);
Я думаю, что то же самое будет работать для вас.
Решение в этом вопросе [ Запросы перекрестного происхождения поддерживаются только для HTTP ] работает для меня.
Но я действительно не понимаю, как вы могли бы заставить его работать без веб-сервера, используя ngView и ngRoute?
Вы конфигурируете ngRoute для получения login.html вне index.html, это означает, что вы используете сервис AJAX для загрузки файла, но сервис AJAX не может работать без веб-сервера. Вот почему я получил мою проблему.