2016-04-13 60 views
4

我需要一種方法來避免無用的計算; 在反應的功能,我有一個反應的對象,我只是需要一個屬性,但如果其他此對象的變化,所有的功能被重新計算:Meteor.js:如何避免無用的刷新/計算/用點符號重新呈現

Template.registerHelper('name', function() { 
    console.log("running"); 
    return Meteor.user().profile.name; 
}); 

(在HTML

<body><p>My name: {{name}}</p></body> 

現在,讓我們改變您的年齡:

Meteor.users.update({_id:Meteor.userId()},{$set:{"profile.age":20}}); 

你猜你所看到的在控制檯(第二次...)

running    x2 

但它應該只運行一次,因爲該名稱沒有改變

爲什麼重要?在我的應用程序中,我有複雜的計算,並且用戶在線/空閒狀態正在輕鬆改變

回答

1

只要使用的無功功能值發生變化,就會重新運行計算。在你的情況下,反應函數是Meteor.user(),所以只要該方法的結果發生變化,就會觸發重新運行。

要將重播限制到真正必要的位置,您需要使用(或創建)一個反應函數,該函數將返回您想跟蹤的值,而不再是其他值。例如:

var prop = new ReactiveVar(); 

Template.template.onRendered(function() { 
    this.autorun(function() { 
    prop.set(Meteor.user().profile.name); 
    }); 
}); 

Template.template.helpers({ 
    hlpr: function() { 
    console.log("RERUN!!!"); 
    return prop.get(); 
    }, 
}); 
+0

總是這樣做是個好主意嗎?因爲我已經創建了一個功能很容易做到這一點,我會將它發佈在一個包中 –

+0

要自我回答,非常感謝!我也學會了使用模板中的反應對象數組是一個壞主意 –