Есть некоторые свойства Iron Router, о которых вам нужно знать.
Скажем, пользователь в настоящее время уже находится на /boxes
и есть шаблон box
, который отображается для этого пути. Если ты:
- нажмите на ссылку
<a href="/boxes?box=123">Click Me</a>
or
- нажмите на ссылку
<a href="{{pathFor 'box'}}">Click Me</a>
Iron Router НЕ будет повторно отображать шаблон, поскольку он уже существует на странице. Он также НЕ будет повторно отображать шаблон, если шаблон box
является частичным шаблоном, который уже отображается на странице, на которой вы находитесь, и также существует на странице, на которую вы хотите перейти.
Поскольку он не перерисовывается, любой код, который у вас есть внутри Template.box.onRendered
, также не будет запускаться снова.
Такое поведение чаще всего встречается в ваших шаблонах layout
, header
и footer
. Для многих пользователей эти шаблоны используются для всех страниц веб-сайта, независимо от пути. Поскольку шаблон макета, верхнего и нижнего колонтитула отображается при первом посещении сайта, они больше никогда не будут отображаться повторно, если пользователь решит перейти к другим частям сайта, используя те же шаблоны, поэтому код внутри Template.layout/header/footer.onRendered
не срабатывает.
Также обратите внимание: даже если реактивный помощник пробелов изменяет физический вид макета / верхнего / нижнего колонтитула, он не квалифицируется как фактический render
, поэтому реактивные обновления шаблона не вызывают обратный вызов onRendered
.
Отсутствие повторного рендеринга — это то, что придает Метеору такое «быстрое» ощущение.
ИЗМЕНИТЬ
Попробуйте кодировать в реактивном стиле, управляемом событиями. Старайтесь не думать слишком много о рендере/повторном рендеринге.
- Вы идете к
/box
- Вы нажимаете на ссылку для
/box?box=2342
- Получите ваши параметры или запрос в Iron Router
https://github.com/iron-meteor/iron-router/blob/devel/Guide.md#route-parameters
В Iron Router используйте данные из параметров или запроса, чтобы установить data context
для шаблона.
Захватите материал из контекста данных по мере необходимости внутри обратных вызовов шаблона .onRendered
, .events
и .helpers
.
При необходимости установите переменные сеанса и используйте их в помощниках, чтобы вносить реактивные изменения на страницу без необходимости повторного рендеринга шаблона. Также используйте события для запуска обновлений переменных сеанса, чтобы, опять же, вызвать реактивные изменения на странице.
Попробуй это:
после этого перейдите в /test?BUNNIES=lalalala
проверьте журналы консоли
test.html
<template name="test">
{{myData}}
</template>
test.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.js
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')
];
}
});
более чистый способ написания роутера
Router.route('/test', {
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')
];
},
data: function(){
var query = this.params.query;
console.log("query: ", query);
return query;
},
action: function(){
console.log("this will re-render if url params changed");
this.render();
}
})
person
fuzzybabybunny
schedule
14.06.2015
subscribe
? - person David Weldon   schedule 14.06.2015?box=123
), но у вас нет кода для доступа к этим параметрам URL-адреса с помощьюthis.params
- stackoverflow.com/questions/23050664/ И да, если вы поместитеconsole.log
внутриTemplate.boxCanvasTpl.onRendered()
и он не отображается, это означает, что шаблон не был отрендерен (или перерендерен, в вашем случае). Я ненавижу, ненавижу, ненавижу форматирование в комментариях Stack Overflow... - person fuzzybabybunny   schedule 14.06.2015