我正在尝试将Express与Angular,尤其是Angular- ui路由器结合起来,并使用Jade:我的指数。翡翠是这样的:
doctype html
html(lang="en")
head
meta(charset='UTF-8')
meta(name='fragment', content='!')
base(href='/')
title Node Express Angular Example
meta(name='viewport', content='width=device-width, initial-scale=1.0')
link(rel='stylesheet', href='//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css')
link(rel='stylesheet', href='./css/style.css')
body(style='', ng-app='myApp', ng-cloak)
include partials/header
div(ui-view)
script(src='//code.jquery.com/jquery-2.1.1.min.js')
script(src='//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js')
script(src='https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js')
script(src='http://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.10/angular-ui-router.min.js')
script(src='https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular-sanitize.js')
script(src='./js/app.js')
我的app.js是这样的:
var myApp = angular.module('myApp', ['ui.router']);
myApp.config(['$stateProvider','$urlRouterProvider','$locationProvider',
function ($stateProvider,$urlRouterProvider,$locationProvider) {
$stateProvider
.state('home', {
url:'/home',
templateUrl: './partials/partial-home.jade'
})
.state('about', {
url:'/about',
template: 'This is the about page'
});
$urlRouterProvider.otherwise('/home');
$locationProvider
.html5Mode(true)
.hashPrefix('!');
}]);
和我的部分家。翡翠是这样的:
div.jumbotron
div.container.text-center
h1 Home Page
p This page is a draft in progress
查看"关于"页面没有问题,但无法查看主页。我还尝试用索引中的<div ui-view></div>
替换div(ui-view)。玉是建议在其他一些SO帖子,但没有效果。有线索吗?
编辑:app.js中有一个拼写错误,它是templateUrl而不是templateUrl。然而,它仍然没有呈现出适当的部分家园。ui-view里面的东西和index。Jade是一样的。我的server.js看起来像这样:
var express = require('express');
var app = express();
var port = process.env.PORT || 8080;
var favicon = require('serve-favicon');
var path = require('path');
app.set('views', __dirname+'/client/views');
app.set('view engine', 'jade');
app.use(express.static(path.join(__dirname, 'client')));
app.get("/*", function (req, res) {
console.log(req.url + req.method);
res.render('index');
});
app.listen(port, function () {
console.log('Express Server listening on ' + port);
});
右,所以express不会自动渲染视图。它将自动发送静态文件,但不呈现动态视图,因此您需要一个显式的路由来匹配部分,并在发送到浏览器之前调用res.render
将它们从jade转换为HTML。沿着这些行尝试一些东西,把它放在index
的通配符路由之前。
app.use("/partials", function (req, res) {
res.render(req.path);
});
我的两分钱:为什么需要让服务器呈现页面?如果原因是你需要在初始加载时传递数据(就像在某个地方的JSON字符串一样,像这样),我会在bootstrapping(来自同一作者的关于如何做到这一点的后续文章)。
除了这个原因,我真的想不出有什么其他的原因让服务器做渲染。使用gulp或更好的webpack (HTMLWebpack插件用于登陆页面是不错的)编译jade模板