내 접근 방식은 RouteController
들과 함께 레이아웃의 응용 프로그램 전체 계층 구조를 사용하는 것입니다.
메인 컨트롤러에서 영향을받은 템플릿을 전체 화면으로 렌더링하는 기본 기본 레이아웃을 렌더링하기 시작했습니다.
client/views/lib/main-layout/main-layout.html
:
<template name="mainLayout">
{{! full screen layout : nothing too fancy here}}
{{> yield}}
</template>
client/views/lib/main-layout/controller.js
:
MainController = RouteController.extend ({ layoutTemplate "mainLayout" onRun : 함수() { 당신이 그 것이다 논리를 넣을 수 있습니다 // 여기에 귀하의 사이트의 모든 페이지에서 실행될 수 있습니다. // 주로 서재응 설정 (문서 제목 설정, 등등 ...) 및 // Google 범용 애널리틱스 API 호출 } }});
그런 다음 navbar와 footer를 제공하고 두 페이지 사이에 페이지를 렌더링하는 페이지 레이아웃을 계속합니다. 페이지의 내용을 .page 및. {{currentRouteName}} - 페이지로 장식하여 현재 어떤 경로를 사용 하느냐에 따라 사이트의 스타일을 다르게 할 수 있습니다. currentRouteName의 구현은 여기에 있습니다 : meteor js iron router: apply CSS change whenever route changes
client/views/lib/page-layout/page-layout.html
:
<template name="pageLayout">
{{! let's add a navbar...}}
{{> yield region="navbar"}}
<div class="{{currentRouteName}}-page page">
{{> yield}}
</div>
{{! ... and a footer}}
{{> yield region="footer"}}
</template>
client/views/lib/page-layout/controller.js
:
PageController=MainController.extend({
layoutTemplate:"pageLayout",
// specify which templates to render in the regions of the layout
yieldTemplates:{
"navbar":{
to:"navbar"
},
"footer":{
to:"footer"
}
}
});
당신은 훨씬 더 구체적인 주어진 레이아웃을 요구하는 페이지에 존재하여 계층 구조를 계속이 생각 예를 들어 사이드 바를 추가하는 것 (데스크톱에서 레이아웃의 1/4을 차지하고, 부트 스트랩을 사용하여 모바일에 스택 됨).
새 레이아웃을 정의 할 때 템플릿 코드를 복사/붙여 넣기하고 여기 저기에 물건을 추가하여 이전 레이아웃을 "확장"할 수 있습니다.
client/views/lib/sidebar-layout/sidebar-layout.html
:
<template name="sidebarLayout">
{{> yield region="navbar"}}
{{! we do not simply yield over here, we add a sidebar layout}}
<div class="{{currentRouteName}}-page page">
<div class="row">
<div class="col-lg-3">
{{> yield region="sidebar"}}
</div>
<div class="col-lg-9">
{{> yield}}
</div>
</div>
</div>
{{> yield region="footer"}}
</template>
client/views/lib/sidebar-layout/controller.js
:
SidebarController=PageController.extend({
layoutTemplate:"sidebarLayout",
// don't forget to yield the navbar and footer too, by extending the yieldTemplates
// property from the parent controller
yieldTemplates:_.extend({
"sidebar":{
to:"sidebar"
}
},PageController.prototype.yieldTemplates)
});
대신 실제 경로에 묶여 아이 컨트롤러를 도출, 바로이 컨트롤러를 사용해서는 안됩니다. 예를 들어, 여기에 사이드 바 컨트롤러를 확장하고 레이아웃에 전용 사이드 바를 렌더링하는 AdminController가 있습니다.물론
AdminController=SidebarController.extend({
// we are deriving from SidebarController, so the layoutTemplate is already set
// to sidebarLayout
// main template to yield to
template:"admin",
yieldTemplates:_.extend({
"adminSidebar":{
to:"sidebar"
}
},SidebarController.prototype.yieldTemplates)
});
실제로 이러한 컨트롤러를 사용하는 것이 당신이 그런 방법으로 당신의 경로를 정의한다 : 당신이 레이아웃 + RouteController
계층 구조를 설정하기 어려운 매우 강력하지 볼 수 있듯이
Router.map(function(){
this.route("admin",{
path:"/admin",
controller:"AdminController"
});
});
을 . "글로벌 레이아웃"템플릿에 묶이지 않으려는 경우 앱을 구성하는 적절한 방법이라고 생각합니다.
나는 접근법을 좋아한다. 이름을 바꿀 때, 나는 PageController가 정의되지 않았다. 오류가있다. PageController 이전에 SideBarController가로드되어 정의되지 않은 오류가 발생할 수 있습니까? – user2858924
내 router.js는 root/lib에 있습니다. 그러나 PageController와 같은 컨트롤러는 root/client/lib에 있습니다. 폴더. 지금까지 내가 아는 한, 루트 lib 클라이언트 폴더 전에로드됩니다, 그래서 나는이 때문에 오류가 발생할 수 있습니다. – user2858924
아마도 여기에로드 순서 문제가있을 것입니다.하지만 그것에 대해 이야기하지는 않았지만 상속은 올바른로드 순서를 암시합니다.이 순서는 현재 올바르게 진행하기가 까다로울 수 있습니다. "root"는 특히 유성에 의해 처리되지 않습니다. 아마도로드 순서 프로세스에서 문서를 다시 읽어야합니다. http://docs.meteor.com/#structuringyourapp – saimeunt