我尝试将客户端集合用作站点配置系统。我插入代表我不同页面的文档,iron-router
和导航标签都使用它们来确定它们是什么页面以及它们代表哪些模板。每个页面都使用{{> contentTemplate}}
包含帮助程序来加载它的相关模板。
一切都很好,当数据全部加载完毕。当我在某些网页上重新启动应用时,数据尚未加载,我收到Exception from Deps recompute function: Error: Expected null or template in return value from inclusion function, found: undefined
错误。
这是我的javascript:
StoriesArray = [
{ category: 'teaching', contentTemplate: 'teachingHome', title: 'Teaching Home'},
...
];
Stories = new Meteor.Collection(null);
StoriesArray.forEach(function (story, index) {
story._id = index + '';
Stories.insert(story);
});
// in main.js
Template.teachingPost.contentTemplate = function() {
console.log(this);
console.log(this.contentTemplate);
return Template[this.contentTemplate];
};
// in router.js
this.route('teaching', {
layoutTemplate: 'teachingPost',
data: function() { return Stories.findOne({contentTemplate: 'teachingHome', category: 'teaching'}); }
});
控制台在日志上方的contentTemplate
帮助程序中登录两次,这是第一次:
Object {} main.js?1f560c50f23d9012c6b6dd54469bb32b99aa4285:45
undefined main.js?1f560c50f23d9012c6b6dd54469bb32b99aa4285:46
并且第二次如此:
Object {category: "teaching", contentTemplate: "teachingHome", title: "Teaching Home"} main.js?1f560c50f23d9012c6b6dd54469bb32b99aa4285:45
teachingHome main.js?1f560c50f23d9012c6b6dd54469bb32b99aa4285:46
所以路由器只是过早地尝试加载这些数据。
我已尝试将StoriesArray
加载过程放入我的应用程序的不同文件中,包括lib
,甚至尝试将其放入Meteor.startup
,但它已经过了iron-router
。总是一样的结果。
正常的waitOn
subscription
/ null
模式在这里并不适用,因为这是一个使用{{1}}构建的客户端集合,没有服务器表示。我不希望这个有服务器代表,因为这是静态内容,不需要去我的服务器。
如何在继续之前确保此信息已完成?
答案 0 :(得分:1)
未经测试,但按Iron Router's docs on waitOn
:
从
ready
函数返回订阅句柄或任何带有waitOn
方法的句柄会将句柄添加到等待列表中。
另外一般情况下,find
与data
而不是findOne
一起使用会更好,因为find
会在集合为空时返回空光标而不是findOne
返回undefined
。所以试试这个:
// in router.js
this.route('teaching', {
layoutTemplate: 'teachingPost',
data: function() {
return Stories.find({contentTemplate: 'teachingHome', category: 'teaching'});
},
waitOn: function() {
var handle = {};
handle.ready = function() {
if (Stories.find().count() !== 0)
return true;
else
return false;
}
return handle;
}
});
并调整Template.teachingPost.contentTemplate
函数以使用光标而不是对象。