Angular和Express路由
我已经经历了许多angular度expression的种子,并且研究出它们是如何工作的。 我遇到的问题是: 1)。 我想用ejs-locals进行模板化。 2)。 如何正确configuration服务器端和客户端的路由。 另外,当input/about
等URL时,不会产生错误: cannot /get
angular度app.js包含:
// angular stuff $routeprovider.when('/', { templateUrl: 'index', controller: IndexCtrl }); $routeprovider.when('/about', { templateUrl: 'partials/about', controller: IndexCtrl });
表示应用程序,JS包含:
app.get('/', routes.index); app.get('/about', routes.about);
路线文件夹包含'index.js':
exports.index = function(req, res){ res.render('index',{name:"Hello"}); }; exports.about = function (req, res) { res.render('partials/about'); };
视图文件夹包含index.ejs
:
<!--HTML head/navigation bar here--> <div ng-view></div>
和里面的意见文件夹是partials
文件夹:( Views / partials / )
index.ejs:
<h1>Index</h1>
about.ejs:
<h1>About</h1>
将这些路线添加到您的快递服务器
app.get('/partials/:filename', routes.partials); app.use(routes.index);
然后在routes.js
exports.partials = function(req, res){ var filename = req.params.filename; if(!filename) return; // might want to change this res.render("partials/" + filename ); }; exports.index = function(req, res){ res.render('index', {message:"Hello!!!"}); };
这将确保在向partials/index
和partials/about
请求时,express返回呈现模板。
这是一个要点: https : //gist.github.com/4277025
我就是这么做的。 我使用的是翡翠,但是Ejs会类似:
app.js
// Routes app.get('/', routes.index); app.get('/partials/:name', routes.partials);
我的模板存储在/ views / partials :
app.set('views', __dirname + '/views');
客户端现在可以使用angular的$ routeProvider来加载部分:
/*global define */ define([ 'angular', 'controllers/aController', 'controllers/bController'], function (angular, aController, bController) { 'use strict'; return angular.module('controllers', [], ['$controllerProvider', '$routeProvider', function ($controllerProvider, $routeProvider) { $controllerProvider.register('AController', ['$scope', aController]); $controllerProvider.register('BController', ['$scope', bController]); // routes $routeProvider.when('/A', {templateUrl: 'partials/A', controller: aController}); $routeProvider.when('/B', {templateUrl: 'partials/B', controller: bController}); $routeProvider.otherwise({redirectTo: '/A'}); }]); } );
我在使用玉和棱镜时遇到了一些麻烦,这对我来说是有效的。
目录结构:
public |-js |-css |-views |-main -main.jade |-auth -login.jade server |-includes -layout.jade |-views -index.jade server.js
然后在server.jsconfiguration路由看起来像:
app.configure(function(){ app.set('views', __dirname + '/server/views'); app.set('view engine', 'jade'); }) // server side route for the partials files app.get('/views/*', function(req, res){ res.render('../../public/views/' + req.params); }) // everything handled by this route app.get('*', function(req, res){ res.render('index'); })
然后angular路由看起来像这样:
$routeProvider.when('/', { templateUrl: '/views/main/main', // gets main.jade from server controller: 'mainCtrl' })
我的index.jade
看起来像这样:
extends ../includes/layout block main-content .navbar.navbar-inverse.navbar-fixed-top div(ng-include="'/views/account/navbar-login'") section.content div(ng-view)
你可以尝试这样的事情,
const path = require("path"); /* For serving static HTML files */ app.use(function(req, res, next) { res.sendFile(path.resolve(__dirname + '/dist/index.html')); }); /* For ejs, jade/pug engines */ app.use(function(req, res, next) { res.render(path.join(__dirname, '/dist/index.pug')); });