Express.js jade 模板布局在几页中不起作用
Express.js jade template layout is not working in few pages
我使用 Node、express 和 jade 模板创建了表单。但是我的创建页面不使用我将创建的主布局。我扩展了它在我的员工列表页面上工作但不在创建页面上工作的主要布局。它只显示 html 而不是 css 或 bootstrap。请帮助。
这是我的网站结构。
我的main.jade:
doctype html
html(lang='en')
head
include htmlheader.jade
body.page-body.hold-transition.skin-blue.sidebar-mini(style='background: #d2d6de')
//- | @section('htmlheader')
//- include layouts/partials/htmlheader.jade
//- | @include('layouts.partials.htmlheader')
// this page specific styles
//- | @show
#fb-root
.page-container
.main-content.main-header
include sidebar.jade
include pageheader.jade
block content
// Sample Modal (Default skin)
include footer.jade
//- | @include('layouts.partials.footer')
// Theme Scripts
我的route.js:
var express = require('express');
var router = express.Router();
var employee = require("../controllers/EmployeeController.js");
// Get all employees
router.get('/', employee.list);
// Get single employee by id
router.get('/show/:id', employee.show);
// Create employee
router.get('/create', employee.create);
// Save employee
router.post('/save', employee.save);
// Edit employee
router.get('/edit/:id', employee.edit);
// Edit update
router.post('/update/:id', employee.update);
// Edit update
router.post('/delete/:id', employee.delete);
module.exports = router;
我的create.jade:
extends ../layout/main
block content
body
.container
h3
a(href='/employees') Employee List
//- a.btn.btn-success(href="/employees") Employee List
h1 Create New Employee
form(action='/employees/save', method='post')
.form-group
label(for='name') Name*
.col-md-10
input#name.form-control(type='text', name='name', placeholder='Name')
.form-group
label(for='address') Address*
.col-md-10
input#address.form-control(type='text', name='address', placeholder='Address')
.form-group
label(for='position') Position*
.col-md-10
input#position.form-control(type='text', name='position', placeholder='Position')
.form-group
label(for='salary') Salary*
.col-md-10
input#salary.form-control(type='text', name='salary', placeholder='Salary')
button.btn.btn-default(type='submit') Create
当我尝试这个时 http://localhost:3000/employees/create 它会显示这个
我的index.jade:
extends ../layout/main
block content
body
.container
h3
a(href='/employees/create') Create Employee
h1 Employee List
//- if employee.length>0
//- for(var i=0 i<employee.length i++)
table.table.table-striped
thead
tr
th Employee Name
th Position
tbody
tr
//- td
//- a(href='/employees/show/#{employee[i]._id}') #{employee[i].name}
td Moaiz
//- td #{employee[i].position}
td Software Developer
//- div No employees found.
在 index.jade 中,我使用相同的布局,它会像这样显示:
请在我遗漏或做错的地方提供帮助。
编辑:
我认为问题在于它没有选择正确的路径。
这是图片:
当我点击创建员工时,路径将从 employees
开始。而且我找不到为什么它在路径中包含 employees
。我认为这就是为什么它无法正确显示布局的问题。在点击您在图像中看到的 create
之前,它不包含路径中的 employees
。请帮助我找到解决方案。
这是我的 htmlheader.jade:
head
meta(http-equiv='X-UA-Compatible', content='IE=edge')
meta(charset='utf-8')
meta(name='viewport', content='width=device-width, initial-scale=1')
meta(name='description', content='Admin Dashboard')
meta(name='author', content='')
meta(property='og:type', content='website')
meta(property='og:title', content='')
meta(property='og:description', content='')
meta(property='og:image', content='')
// CSRF Token
meta(name='csrf-token', content='{{ csrf_token() }}')
//- | {{--
//- title {{ config('app.name', 'Admin Dashboard') }}
//- | --}}
title Admin Dashboard
// Styles
script(src="{{url('dist/js/jquery-1.11.3.min.js')}}")
link(rel='stylesheet', href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic')
//- | {{--
//- link(rel='stylesheet', href="{{url('assets/js/jquery-ui/css/no-theme/jquery-ui-1.10.3.custom.min.css')}}")
//- | --}}
meta(content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no', name='viewport')
// Bootstrap 3.3.7
link(rel='stylesheet',
href="bower_components/bootstrap/dist/css/bootstrap.min.css")
// Font Awesome
link(rel='stylesheet', href="bower_components/font-awesome/css/font-awesome.min.css")
// Ionicons
link(rel='stylesheet', href="bower_components/Ionicons/css/ionicons.min.css")
// jvectormap
link(rel='stylesheet', href="bower_components/jvectormap/jquery-jvectormap.css")
// Theme style
link(rel='stylesheet', href="dist/css/AdminLTE.min.css")
//
AdminLTE Skins. Choose a skin from the css/skins
folder instead of downloading all of them to reduce the load.
link(rel='stylesheet', href="dist/css/skins/_all-skins.min.css")
link(rel='stylesheet', href="bower_components/morris.js/morris.css")
link(rel='stylesheet', href="bower_components/jvectormap/jquery-jvectormap.css")
// Date Picker
link(rel='stylesheet', href="bower_components/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css")
// Daterange picker
link(rel='stylesheet', href="bower_components/bootstrap-daterangepicker/daterangepicker.css")
// bootstrap wysihtml5 - text editor
link(rel='stylesheet', href="plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css")
// HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries
//if lt IE 9
script(src='https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js')
script(src='https://oss.maxcdn.com/respond/1.4.2/respond.min.js')
block custom_styles
问题是您使用的是相对 url,这取决于您当前的路径。相反,您应该将静态资产设置为绝对 url's,这样当您导航到嵌套的 url's.
时它就不会改变
改变这个
link(rel='stylesheet', href="bower_components/font-awesome/css/font-awesome.min.css")
对此
link(rel='stylesheet', href="/bower_components/font-awesome/css/font-awesome.min.css")
所有静态资产都应该这样做
// Ionicons
link(rel='stylesheet', href="/bower_components/Ionicons/css/ionicons.min.css")
// jvectormap
link(rel='stylesheet', href="/bower_components/jvectormap/jquery-jvectormap.css")
// Theme style
link(rel='stylesheet', href="/dist/css/AdminLTE.min.css")
...
...
...
首先打开localhost:port浏览器window的开发管理器(F12键)。
转到控制台选项卡,查看 errors.Some css 并且缺少 js 文件路径。
根据 adminlte js 和 css 文件更新路径。
如下所示:
- header.jade
title=AdminLTE
meta(name='viewport', content='width=device-width, initial-scale=1.0')
link(rel='stylesheet', href='https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css')
link(rel='stylesheet', href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css')
link(rel='stylesheet', href='/adminlte/dist/css/AdminLTE.min.css')
link(rel='stylesheet', href='/adminlte/dist/css/skins/_all-skins.min.css')
link(rel='stylesheet', href='/adminlte/plugins/iCheck/square/blue.css')
- js.jade
`
script(type='text/javascript', src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js')
script(type='text/javascript', src='/adminlte/bower_components/bootstrap/dist/js/bootstrap.min.js')
script(type='text/javascript', src='/adminlte/bower_components/jquery-slimscroll/jquery.slimscroll.min.js')
script(type='text/javascript', src='/fontawesome/js/fontawesome.js')
script(type='text/javascript', src='/adminlte/dist/js/pages/dashboard.js')
script(type='text/javascript', src='/adminlte/dist/js/demo.js')
script(type='text/javascript', src='/adminlte/plugins/iCheck/icheck.min.js')
`
现在您的屏幕将按照主题视图显示。
我使用 Node、express 和 jade 模板创建了表单。但是我的创建页面不使用我将创建的主布局。我扩展了它在我的员工列表页面上工作但不在创建页面上工作的主要布局。它只显示 html 而不是 css 或 bootstrap。请帮助。
这是我的网站结构。
我的main.jade:
doctype html
html(lang='en')
head
include htmlheader.jade
body.page-body.hold-transition.skin-blue.sidebar-mini(style='background: #d2d6de')
//- | @section('htmlheader')
//- include layouts/partials/htmlheader.jade
//- | @include('layouts.partials.htmlheader')
// this page specific styles
//- | @show
#fb-root
.page-container
.main-content.main-header
include sidebar.jade
include pageheader.jade
block content
// Sample Modal (Default skin)
include footer.jade
//- | @include('layouts.partials.footer')
// Theme Scripts
我的route.js:
var express = require('express');
var router = express.Router();
var employee = require("../controllers/EmployeeController.js");
// Get all employees
router.get('/', employee.list);
// Get single employee by id
router.get('/show/:id', employee.show);
// Create employee
router.get('/create', employee.create);
// Save employee
router.post('/save', employee.save);
// Edit employee
router.get('/edit/:id', employee.edit);
// Edit update
router.post('/update/:id', employee.update);
// Edit update
router.post('/delete/:id', employee.delete);
module.exports = router;
我的create.jade:
extends ../layout/main
block content
body
.container
h3
a(href='/employees') Employee List
//- a.btn.btn-success(href="/employees") Employee List
h1 Create New Employee
form(action='/employees/save', method='post')
.form-group
label(for='name') Name*
.col-md-10
input#name.form-control(type='text', name='name', placeholder='Name')
.form-group
label(for='address') Address*
.col-md-10
input#address.form-control(type='text', name='address', placeholder='Address')
.form-group
label(for='position') Position*
.col-md-10
input#position.form-control(type='text', name='position', placeholder='Position')
.form-group
label(for='salary') Salary*
.col-md-10
input#salary.form-control(type='text', name='salary', placeholder='Salary')
button.btn.btn-default(type='submit') Create
当我尝试这个时 http://localhost:3000/employees/create 它会显示这个
我的index.jade:
extends ../layout/main
block content
body
.container
h3
a(href='/employees/create') Create Employee
h1 Employee List
//- if employee.length>0
//- for(var i=0 i<employee.length i++)
table.table.table-striped
thead
tr
th Employee Name
th Position
tbody
tr
//- td
//- a(href='/employees/show/#{employee[i]._id}') #{employee[i].name}
td Moaiz
//- td #{employee[i].position}
td Software Developer
//- div No employees found.
在 index.jade 中,我使用相同的布局,它会像这样显示:
请在我遗漏或做错的地方提供帮助。
编辑:
我认为问题在于它没有选择正确的路径。 这是图片:
当我点击创建员工时,路径将从 employees
开始。而且我找不到为什么它在路径中包含 employees
。我认为这就是为什么它无法正确显示布局的问题。在点击您在图像中看到的 create
之前,它不包含路径中的 employees
。请帮助我找到解决方案。
这是我的 htmlheader.jade:
head
meta(http-equiv='X-UA-Compatible', content='IE=edge')
meta(charset='utf-8')
meta(name='viewport', content='width=device-width, initial-scale=1')
meta(name='description', content='Admin Dashboard')
meta(name='author', content='')
meta(property='og:type', content='website')
meta(property='og:title', content='')
meta(property='og:description', content='')
meta(property='og:image', content='')
// CSRF Token
meta(name='csrf-token', content='{{ csrf_token() }}')
//- | {{--
//- title {{ config('app.name', 'Admin Dashboard') }}
//- | --}}
title Admin Dashboard
// Styles
script(src="{{url('dist/js/jquery-1.11.3.min.js')}}")
link(rel='stylesheet', href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic')
//- | {{--
//- link(rel='stylesheet', href="{{url('assets/js/jquery-ui/css/no-theme/jquery-ui-1.10.3.custom.min.css')}}")
//- | --}}
meta(content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no', name='viewport')
// Bootstrap 3.3.7
link(rel='stylesheet',
href="bower_components/bootstrap/dist/css/bootstrap.min.css")
// Font Awesome
link(rel='stylesheet', href="bower_components/font-awesome/css/font-awesome.min.css")
// Ionicons
link(rel='stylesheet', href="bower_components/Ionicons/css/ionicons.min.css")
// jvectormap
link(rel='stylesheet', href="bower_components/jvectormap/jquery-jvectormap.css")
// Theme style
link(rel='stylesheet', href="dist/css/AdminLTE.min.css")
//
AdminLTE Skins. Choose a skin from the css/skins
folder instead of downloading all of them to reduce the load.
link(rel='stylesheet', href="dist/css/skins/_all-skins.min.css")
link(rel='stylesheet', href="bower_components/morris.js/morris.css")
link(rel='stylesheet', href="bower_components/jvectormap/jquery-jvectormap.css")
// Date Picker
link(rel='stylesheet', href="bower_components/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css")
// Daterange picker
link(rel='stylesheet', href="bower_components/bootstrap-daterangepicker/daterangepicker.css")
// bootstrap wysihtml5 - text editor
link(rel='stylesheet', href="plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css")
// HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries
//if lt IE 9
script(src='https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js')
script(src='https://oss.maxcdn.com/respond/1.4.2/respond.min.js')
block custom_styles
问题是您使用的是相对 url,这取决于您当前的路径。相反,您应该将静态资产设置为绝对 url's,这样当您导航到嵌套的 url's.
时它就不会改变改变这个
link(rel='stylesheet', href="bower_components/font-awesome/css/font-awesome.min.css")
对此
link(rel='stylesheet', href="/bower_components/font-awesome/css/font-awesome.min.css")
所有静态资产都应该这样做
// Ionicons
link(rel='stylesheet', href="/bower_components/Ionicons/css/ionicons.min.css")
// jvectormap
link(rel='stylesheet', href="/bower_components/jvectormap/jquery-jvectormap.css")
// Theme style
link(rel='stylesheet', href="/dist/css/AdminLTE.min.css")
...
...
...
首先打开localhost:port浏览器window的开发管理器(F12键)。
转到控制台选项卡,查看 errors.Some css 并且缺少 js 文件路径。
根据 adminlte js 和 css 文件更新路径。
如下所示:
- header.jade
title=AdminLTE
meta(name='viewport', content='width=device-width, initial-scale=1.0')
link(rel='stylesheet', href='https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css')
link(rel='stylesheet', href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css')
link(rel='stylesheet', href='/adminlte/dist/css/AdminLTE.min.css')
link(rel='stylesheet', href='/adminlte/dist/css/skins/_all-skins.min.css')
link(rel='stylesheet', href='/adminlte/plugins/iCheck/square/blue.css')
- js.jade
`
script(type='text/javascript', src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js')
script(type='text/javascript', src='/adminlte/bower_components/bootstrap/dist/js/bootstrap.min.js')
script(type='text/javascript', src='/adminlte/bower_components/jquery-slimscroll/jquery.slimscroll.min.js')
script(type='text/javascript', src='/fontawesome/js/fontawesome.js')
script(type='text/javascript', src='/adminlte/dist/js/pages/dashboard.js')
script(type='text/javascript', src='/adminlte/dist/js/demo.js')
script(type='text/javascript', src='/adminlte/plugins/iCheck/icheck.min.js')
`
现在您的屏幕将按照主题视图显示。