我有这样的路线:
Router.route('/box', function () {
this.render('boxCanvasTpl');
},{
name: 'box',
layoutTemplate: 'appWrapperLoggedInTpl',
waitOn: function() {
console.log("Box route ran ok.");
return [
Meteor.subscribe('item_ownership_pub', function() {
console.log("subscription 'item_ownership_pub' is ready.");
}),
Meteor.subscribe('my_items', function() {
console.log("subscription 'my_items' is ready.");
})
];
}
});
...我正在点击模板中的链接:
<a href="/box?box=123" class="box-num-items">My Link</a>
我收到'Box route ran ok'。消息,但某些原因页面未导航到给定的URL。我在渲染'boxCanvasTpl'时运行的函数中添加了console.log代码,但这些代码未显示在浏览器控制台中。似乎中间的某些东西正在阻止templkate重新渲染,但不能指责它 - 任何想法?
答案 0 :(得分:2)
您需要注意Iron Router的某些属性。
假设用户当前已经在/boxes
,并且有一个box
模板可以呈现该路径。如果你:
<a href="/boxes?box=123">Click Me</a>
或
<a href="{{pathFor 'box'}}">Click Me</a>
Iron Router不会重新呈现模板,因为它已存在于页面上。如果box
模板恰好是已在您所在页面上呈现的部分模板,并且也存在于您要导航到的页面上,它也不会重新呈现模板。
由于它不会重新渲染,Template.box.onRendered
中的任何代码也不会再次运行。
此行为在您的layout
,header
和footer
模板中最为常见。对于许多用户而言,这些模板用于所有网站的页面,而不管路径如何。因为布局,页眉和页脚模板是在用户第一次访问该站点时呈现的,所以如果用户决定使用相同的模板导航到站点的其他部分,则不会再次重新呈现它们,因此代码里面Template.layout/header/footer.onRendered
不会开火。
另请注意 - 即使反应性Spacebars助手更改了布局/页眉/页脚的物理外观,它也不符合实际render
的条件,因此对模板的反应性更新不会触发{{ 1}}回调。
缺乏重新渲染是让Meteor“感觉”活泼的感觉。
修改强>
尝试以反应式,事件驱动的方式编写代码。尽量不要在渲染/重新渲染的意义上思考太多。
onRendered
/box
https://github.com/iron-meteor/iron-router/blob/devel/Guide.md#route-parameters
在Iron Router中,使用params或query中的数据为模板设置/box?box=2342
。
根据需要在模板的data context
,.onRendered
和.events
回调中抓取数据上下文中的内容。
根据需要设置会话变量,并在帮助程序中使用它们,以便对页面进行反应性更改,而无需重新呈现模板。还可以使用事件触发对会话变量的更新,再次触发对页面的响应性更改。
试试这个:
之后,去/测试?BUNNIES = lalalala
查看控制台日志
<强>的test.html 强>
.helpers
<强> test.js 强>
<template name="test">
{{myData}}
</template>
<强> router.js 强>
Template.test.helpers({
myData: function() {
console.log("data context accessed from test.helpers: ", this);
console.log("this.BUNNIES accessed from test.helpers: ", this.BUNNIES);
return this.BUNNIES;
}
});
Template.test.onRendered(function() {
console.log("data context accessed from test.onRendered: ", this.data);
});
Template.test.events({
'click': function(){
console.log("data accessed from test.events: ", this);
}
});
更清洁的方式来编写路由器
Router.route('/test', function() {
console.log("routed!");
this.render('test');
}, {
name: 'test',
data: function(){
//here I am setting the data context
// for /test?BUNNIES=1234
var query = this.params.query;
console.log("query: ", query);
return query;
},
waitOn: function() {
console.log("waitOn is running (should see this message once for each subscription)");
return [
Meteor.subscribe('item_ownership_pub'),
Meteor.subscribe('my_items')
];
}
});