我有一个可能不是那么独特的问题,有一个复杂的流星应用程序。
我有几个操作会导致部分页面刷新,而这些操作实际上并不需要。但我无法找到哪个find()(或多个find())是被触发的那个。我知道有问题的收藏,而不是找到()。
我可以在我使用的每个查找中使用observeChanges,但这将是很多额外的代码。
是否有一种简单的方法可以查看触发的内容和内容?
谢谢!
答案 0 :(得分:19)
这是一个您可能会觉得有用的渲染记录功能。它记录每个模板呈现给控制台的次数。您知道在初始页面加载后是否重新呈现模板,这是因为它所依赖的被动数据源已经发生了变化。可以使用辅助方法访问此反应性数据源,或者模板是列表项(即{{#each ...}}
块帮助程序内),并添加/移动/删除/更改列表项。还要记住,子项模板在渲染或重新渲染子项时调用其父项的渲染回调。所以,这可能会让你误以为父母实际上是从DOM中取出并放回去了,但事实并非如此。
因此,您可以在客户端代码的末尾调用此函数来查看渲染计数:
function logRenders () {
_.each(Template, function (template, name) {
var oldRender = template.rendered;
var counter = 0;
template.rendered = function () {
console.log(name, "render count: ", ++counter);
oldRender && oldRender.apply(this, arguments);
};
});
}
编辑:这是一种包装查找光标以将光标的所有更改记录到控制台的方法。我刚刚为此编写了一个类似的函数,用于我正在研究的一个叫做反应视觉的新软件包。希望很快就会发布。
var wrappedFind = Meteor.Collection.prototype.find;
Meteor.Collection.prototype.find = function () {
var cursor = wrappedFind.apply(this, arguments);
var collectionName = this._name;
cursor.observeChanges({
added: function (id, fields) {
console.log(collectionName, 'added', id, fields);
},
changed: function (id, fields) {
console.log(collectionName, 'changed', id, fields);
},
movedBefore: function (id, before) {
console.log(collectionName, 'movedBefore', id, before);
},
removed: function (id) {
console.log(collectionName, 'removed', id);
}
});
return cursor;
};
答案 1 :(得分:0)
感谢@cmather的想法。
她Meteor 1.3
已经改编,logRenders
// Log all rendered templates
// If filter is set, only templates in filter will be logged
// @params filter - name or names of template to filter
logRenders = function logRenders (filter) {
for (name in Object(Template)){
if (filter && !Array.isArray(filter)) filter = [filter];
var template = Template[name];
if (!template) continue;
if (filter && filter.indexOf(name) == -1){
// Clear previous logRenders
if ('oldRender' in template) template.rendered = template.oldRender;
delete template.oldRender;
continue;
}
var t = function(name, template){
if (!('oldRender' in template)) template.oldRender = template.rendered;
var counter = 0;
template.rendered = function () {
console.log(name, ++counter, this);
this.oldRender && this.oldRender.apply(this, arguments);
};
}(name, template);
};
};