2014-02-06 63 views
2

我有一個流星模板,在最初的幾秒內重新渲染約6次,使一個微調(spin.js)口吃。流星 - 如何判斷是什麼導致模板重新渲染?

我不能說爲什麼模板本身會重新渲染,並且添加{{#isolate}}和/或{{#constant}}標記沒有幫助。

我的問題:是否有一種編程方式來確定什麼事件或反應性數據源觸發給定的重新渲染?

回答

2

所以要找出哪個模板助手正在失效,你有幾種選擇:

  1. 首先是隻需編輯源流星packages/deps/deps.js,只是增加一個堆棧跟蹤到invalidate功能。

    你可以得到的東西堆棧跟蹤像try{throw new Error('');}catch(ex){ console.log(ex.stack);}

  2. 代理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); 
    } 
    
  3. 產生反應函數包裝,無效

    時打印日誌信息

    您可以執行類似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")