流星js的iron router:当路由发生变化时,应用CSS更改
meteor js iron router: apply CSS change whenever route changes
我的应用程序中有主页,联系人页面和其他几个产品相关页面。
目标是将背景图像仅应用于特定路线:/homepage
和/contact
。
我现在在我的主页上与一个助手一起破解这个,像这样:
Template.homepage.rendered = function () {
var route = Router.current();
if ( route.path == '/' ) {
document.body.className = "showBackgroundImage";
}
};
部分获胜,因为这将激活css,但我需要在路由改变时停用。我还在我的router.js
中尝试了以下操作:
this.route('homepage', {
path: '/',
onAfterAction: function (argument) {
// add a class name to body
document.body.className = "showBackgroundImage";
}
});
和CSS的背景标准:
.showBackgroundImage {
background: url(bgImage.jpg) no-repeat center center fixed;
}
使用iron:router
布局和通过路由为每个页面应用不同的类很容易做到。
首先你需要定义一个主布局,如:
<template name="mainLayout">
<!-- optional navbar yield -->
{{> yield region="navbar"}}
<div class="{{currentRouteName}}-page">
{{> yield}}
</div>
<!-- optional footer yield -->
{{> yield region="footer"}}
</template>
currentRouteName
助手应该看起来像:
UI.registerHelper("currentRouteName",function(){
return Router.current()?Router.current().route.getName():"";
});
然后我建议将RouteController
关联到您的主布局,它将作为所有RouteController
的基类。
MainController=RouteController.extend({
layoutTemplate:"mainLayout",
// yield navbar and footer templates to navbar and footer regions respectively
yieldTemplates:{
"navbar":{
to:"navbar"
},
"footer":{
to:"footer"
}
}
});
接下来,你需要确保你的路由使用的控制器是从MainController
派生出来的。
HomeController=MainController.extend({
template:"home"
});
Router.map(function(){
this.route("home",{
path:"/",
// optional, by default iron:router is smart enough to guess the controller name,
// by camel-casing the route name and appending "Controller"
controller:"HomeController"
});
});
现在你的主页被一个div包围了,这个div有一个"home-page"类,所以你可以用普通的CSS样式(或者更好的是,使用LESS):
.home-page{
/* your css goes here */
}
如果你定义了其他路由,这将无缝地工作,只要从MainController
继承,你就会自动拥有一个带有route-name-page类的页面。
.home-page, .contact-page{
/* your css goes here */
}
你可以用布局做一些很好的事情,我强烈建议你使用它们。
我已经使用iron-router
和jQuery
做了这个确切的事情。我是这么做的。
/**
* Add a background image for certain routes.
*/
var setBackground = function () {
var route = this.route.name;
var routes = ['homepage', 'contact'];
if (_.contains(routes, route)) {
$('body').addClass('showBackgroundImage');
} else {
$('body').removeClass('showBackgroundImage');
}
};
Router.onBeforeAction(setBackground);
使用Meteor 1.2和iron-router,这对我来说是非常容易的:
Router.onBeforeAction(function() {
$('body').addClass(this.route.options.template);
this.next();
});
就是这样!
这将从您正在使用的模板中获取名称并将其分配给正文。
多么容易和方便!!
如果你想指定一个特定的名称而不是模板名称,只需将
this.route.options.template
替换为this.route.getName()
并为你的路由指定一个名称。
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- Canvas Html5绘图应用程序,移动画布会导致重大问题
- Emberjs应用程序加载在除Index之外的所有路由上
- 使用电话间隙在Android应用程序中显示SQL Lite的数据
- 跟踪在页面加载时应用内联样式的JavaScript
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- 如果文本字段为空,则使用JavaScript应用CSS样式
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 为什么在单独的函数中应用时转换会闪烁/断断续续(D3)
- 检测Ionic中特定的应用程序状态变化
- 在过去24小时内,谷歌应用程序脚本或可视化API的任何变化
- 我的手机间隙应用程序没有变化
- 角度2.x变化<标题>在头脑中(在我的应用程序之外)
- 流星js的iron router:当路由发生变化时,应用CSS更改
- 图像变化的应用速度
- 如何让一个laravel 5.3应用程序在SASS/JS发生变化时自动加载
- js模板页面没有反映expressjs (node.js)应用中的变化
- 当应用toString()时,数值会发生变化
- 发生状态变化时不应用ng类
- 在ember应用中,每次url发生变化时,都会触发路由/控制器钩子