2016-04-13 9 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

Чтобы ответить, очень спасибо! Я также узнал, что использование массива реактивного объекта в шаблоне - это действительно плохая идея –

 Смежные вопросы

  • Нет связанных вопросов^_^