2014-02-07 127 views
0

以下是我正在嘗試的操作。如果當前Photo對象(我們通過photoId變量獲得)具有URL屬性,則將其顯示爲img。如果沒有,表現出微調:流星 - 防止模板每次重新渲染{{#if}}

{{#if photoUrl photoId}} 
    <img src="{{photoUrl photoId}}"/> 
{{else}} 
    {{> spinner}} 
{{/if}} 

輔助方法:

photoUrl: function (photoId) { 
    var photo = Photos.findOne(photoId); 
    if (photo && photo.croppedUrl) 
    return photo.croppedUrl; 
} 

這工作正常的舊文章。但是剛發佈的帖子,其照片仍在上傳,在頭幾秒鐘內多次提交該模板。如果內容是靜態的,那麼這將是可以的,但是微調器正在旋轉,並且每次重新移動都會重新開始。

我的直覺是,模板重新描繪,因爲我的上傳庫(collectionFS)正在改變新Photo對象,每次出現這種情況時,流星重新評估photoUrl,因爲它有一個對象作爲依賴(右?) 。例如,在Meteor.nonreactive中包裝輔助主體,可以解決當前的問題(儘管它創建了其他問題)。

我會假設Meteor只會在實際更改爲{{#if}}條件後重新渲染模板,但似乎每次條件重新渲染時都會重新渲染,無論結果如何。

有沒有辦法避免不必要的(即相同的值{{#if}}條件)重新渲染?或者我必須找到一種方法來獲取照片網址,而不直接引用Photo對象?

回答

0

您最有可能不需要在Meteor的未來版本中這樣做。

在當前版本中,如果{{if}}值沒有更改,則不應該進行重新渲染。重新呈現可能是由頁面上的其他內容導致整個模板重新呈現的原因。也許你正在模板中的其他地方使用集合中的某些東西?模板有一個檢查:只有當HTML不同時,模板纔會被重新渲染。

要解決這個問題,你可以在{{#isolate}} .. {{/isolate}}塊中包裝一些東西。這會將塊內的所有內容隔離在外。

因此,這些更改將重新渲染並修補隔離塊中的所有內容,而不是重新渲染整個模板。

+0

我使用'isolate'試圖(和'constant')阻止所有以各種方式在模板上進行,而且它看起來好像反應性/迴歸來自「if」塊本身。 – Zach

+0

嘗試放入'console.log'來查看photoUrl助手中的更改。隔離的想法不是停止重新渲染,而是將其與模板的其餘部分隔離。要阻止它重新渲染,你需要看看是什麼導致它改變,如果它正在改變(它應該作爲它的重新渲染)。 – Akshat

0

我也有類似的麻煩。我認爲有幾種方法可以解決問題。

  1. 嘗試使用,而不是找到的findOne,如 {{#each photoes}}{{#if croppedUrl}}...{{/each}}

  2. 嘗試單獨的新項目和老項目,利用這些代碼和新項目直接呈現出旋老項目表演。

  3. 嘗試使用恆定的,並顯示在你的js代碼需要在渲染

一切希望它能有助於