Angular-ui路由器加载玉模板

时间:2014-06-02 07:37:23

标签: angularjs express pug angular-ui-router

我正在尝试将Express与Angular结合使用,特别是Angular-UI路由器并使用Jade: 我的index.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('!');
}]);

我的partial-home.jade看起来像这样:

div.jumbotron
    div.container.text-center
        h1 Home Page
        p This page is a draft in progress

查看“关于”页面时没有问题,但我无法查看主页。 我也尝试用index.jade中的<div ui-view></div>替换div(ui-view),正如在其他一些SO帖子中所建议的那样但是没有效果。有线索吗?

编辑:app.js中存在拼写错误,它是templateUrl而不是templateURL。但是它仍然没有呈现正确的partial-home.jade,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);
});

2 个答案:

答案 0 :(得分:0)

如此明确表示不会自动呈现视图。它会自动发送静态文件,但不会呈现动态视图,因此需要一个显式路由来匹配部分,并在发送到浏览器之前调用res.render将它们从jade转换为HTML。尝试沿着这些方向行事,把它放在index的通配符路径之前。

app.use("/partials", function (req, res) {
  res.render(req.path);
});

答案 1 :(得分:0)

我的2美分: 为什么有必要让服务器呈现页面? 如果原因是您需要在初始加载时传递数据(在某处思考像JSON字符串something like this),我会在引导(a follow up from the same author on how to go about that)上执行此操作。

除非这个原因,否则我无法想到让服务器进行渲染的任何其他原因。使用gulp或更好地在webpack中编译你的jade模板(登陆页面的HTMLWebpack插件很不错)。