流星 - 如何判断导致模板重新渲染的原因?

时间:2014-02-06 23:23:56

标签: meteor

我有一个Meteor模板,在最初几秒内重新渲染约6次,制作一个旋转器(spin.js)口吃。

我无法确定为什么模板本身会重新渲染,添加{{#isolate}}和/或{{#constant}}标签无济于事。

我的问题:是否有一种编程方式来确定哪个事件或被动数据源正在触发给定的重新渲染?

1 个答案:

答案 0 :(得分:2)

因此,要确定哪个模板助手无效,您可以选择以下几个选项:

  1. 首先只是编辑Meteor packages/deps/deps.js的源代码,只需将堆栈跟踪添加到invalidate函数。

    您可以使用try{throw new Error('');}catch(ex){ console.log(ex.stack);}

  2. 之类的内容获得堆栈跟踪
  3. 代理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);
    }
    
  4. 创建一个反应函数包装器,它在失效时打印一条日志消息

    您可以执行类似于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")