我有一个Meteor模板,在最初几秒内重新渲染约6次,制作一个旋转器(spin.js)口吃。
我无法确定为什么模板本身会重新渲染,添加{{#isolate}}
和/或{{#constant}}
标签无济于事。
我的问题:是否有一种编程方式来确定哪个事件或被动数据源正在触发给定的重新渲染?
答案 0 :(得分:2)
因此,要确定哪个模板助手无效,您可以选择以下几个选项:
首先只是编辑Meteor packages/deps/deps.js
的源代码,只需将堆栈跟踪添加到invalidate
函数。
您可以使用try{throw new Error('');}catch(ex){ console.log(ex.stack);}
代理Deps.Computation.prototype.invalidate
,类似于(1)
var oldInvalidate = Deps.Computation.prototype.invalidate;
Deps.Computation.prototype.invalidate = function(){
try{throw new Error('');}catch(ex){ console.log(ex.stack);}
return oldInvalidate.apply(this,arguments);
}
创建一个反应函数包装器,它在失效时打印一条日志消息
您可以执行类似于isolate-value
包的操作 - 但添加日志记录语句(并删除值隔离)
(免责声明:尚未对此代码进行全面测试,但您可以获得一般性的想法)
logInvalidation = (stmt, fn) ->
value = null
outerComputation = Deps.currentComputation
dep = new Deps.Dependency()
c = Deps.autorun (c) ->
# kill this computation if the computation wrapping the handler is stopped
if outerComputation?.stopped
c.stop()
return
unless c.firstRun
# a dependency from `fn` was changed (hence this computation was invalidated)
# so, invalidate anything that depends on `dep`
console.log("Helper invalidated #{stmt}")
dep.changed()
else
# attach dependencies in `fn`, and pass result to `value`
value = fn()
return
dep.depend()
return value
将你怀疑的帮助包裹起来:
Template.myTemplate.helpers
myHelper: ()->
return logInvalidation 'myHelper invalidated!', ()->
return Session.get("myValue")