2015-03-06 4 views
1

Я пытаюсь понять что-то, что, я уверен, довольно обычное в метеоре, то есть с использованием реактивных вычисленных значений. Вот простой пример того, что я пытаюсь добиться. Код не работает, но он выглядит примерно так, как я ожидал, может работать. Я использую AUTOFORM для схемы валидацийДинамические расчетные значения в шаблонах метеоров

Schema = {} 
Schema.calcs = new SimpleSchema({ 
    a: {type: Number}, 
    b: {type: Number} 
}); 

Template.Calcs.helpers({ 
    total: function() { 
     var a = Autoform.getFieldValue('calcs', 'a') 
     var b = Autoform.getFieldValue('calcs', 'b'); 
     // Would be nice if I could do something like this instead of the above 
     // var a = this.Autoform.a; 
     // var b = this.Autoform.b; 
     return a + b; 
    }, 
    totalDouble: function() { 
     var total = this.total; // This doesn't work 
     return total * 2; 
    } 
}); 

Шаблон выглядит что-то вроде:

<template name='calcs'> 
    {{> quickForm id="calcs" schema="Schema.calcs" validation="keyup"}} 
    <ul> 
    <li>Total: {{total}}</li> 
    <li>Double Total: {{totalDouble}}</li> 
    <ul> 
</template> 

У меня есть 3 вопроса:

  1. Как получить значение другого помощника в коде?
  2. Есть ли более чистый способ, чем Autoform.getFieldValue(...), чтобы ввести введенные значения в помощнике?
  3. Действительно ли это лучший способ добиться того, что я хочу с помощью Meteor?

Это на самом деле тестовый проект я мигрирующие из Эмбер, и поведение я после того, как реализован в контроллере Ember (за исключением проверки), как это:

App.CalcsController = Ember.Controller.extend({ 
    a: null, 
    b: null, 

    total: function() { 
     return this.get('a') + this.get('b'); 
    }.property('a', 'b'), 

    totalDouble: function() { 
     return this.get('total') * 2; 
    }.property('total') 
}); 
+0

Прежде всего, this.total является функцией, вы можете захотеть добавить отсутствующую скобку. – Salketer

+0

Является ли это функцией? Вот что я спрашивал. Насколько я вижу, «this.total» вообще не существует ... – aquavitae

+0

есть грязный хак, если вы используете железный маршрутизатор, вы можете указать return this.total = a + b, а затем вы можете получить к нему доступ от других помощников –

ответ

1

Вы можете хранить его in session:

total: function() { 
    var a = parseInt(Autoform.getFieldValue('calcs', 'a')) 
    var b = parseInt(Autoform.getFieldValue('calcs', 'b')); 
    var total = a+b; 
    Session.set("total", total); 
    return total; 
    }, 
totalDouble: function(){ 
    var total = Session.get("total"); 
    return total* 2; 
} 
Смежные вопросы