2016-10-31 69 views
1

我有一個基於autoform的Meteor Blaze模板。在文字變化上重新渲染Blaze模板

<template name="patientForm"> 

<div class='mdl-cell mdl-cell--12-col'> 
    {{#autoForm id="insertUpdatePatientForm" collection="Patients" doc=selectedPatientDoc 
    type=formType validation="browser" template="semanticUI"}} 
    <div class='two fields'> 
    {{> afQuickField name="firstName"}} 
    {{> afQuickField name="lastName"}} 
    </div> 
    <div class='two fields'> 
    {{> afQuickField name="phn.type"}} 
    {{> afQuickField name="phn.value" class="ramq"}} 
    </div> 
     <div class='two fields'> 
     {{> afQuickField name="birthDate"}} 
     {{> afQuickField name="gender"}} 
     </div> 

    <button class="ui submit button" type="submit">Save</button> 
    <div class="ui error message"></div> 
    {{/autoForm}} 
</div> 
</template> 

我想處理名稱爲phn.value的輸入的文本更改事件。根據文本,我想自動填充另外兩個字段:性別和出生日期。我通過直接更改模板數據如下這樣做:

Template.patientForm.events({ 
    'change .ramq': function changeRAMQ(event, templateInstance) { 
     const { patient } = templateInstance.data; 
     if (patient.phn.type === 'RAMQ') { 
      const ramq = event.target.value; 
      const yy = parseInt(ramq.substr(4, 2), 10); 
      let mm = parseInt(ramq.substr(6, 2), 10); 
      const dd = parseInt(ramq.substr(8, 2), 10); 
      patient.gender = mm < 13 ? 'Male' : 'Female'; 
      if (mm > 50) { 
       mm -= 50; 
      } 
      patient.birthDate = moment(new Date(yy, mm, dd)).format('YYYY-MM-DD'); 
     } 
    }, 
}); 

我得到的模板數據,並直接修改的性別和生日時phn.value變化。但是,修改的性別和出生日期不會在autoform/blaze模板中重新呈現。我可以通過哪種方式強制重新渲染Blaze模板或使用替代方法來更改Blaze模板中的其他控件?

回答

1

要啓用的反應,從而領域的重新渲染,你應該使用ReactiveVar(或ReactiveDict)

你可以做到這一點是這樣的:

Template.patientForm.onCreated(function(){ 
    const instance = this; 
    instance.birthDate = new ReactiveVar() 
}); 

而在你的幫手和事件,你可以使用instance.birthDate.set()/ get()方法

Template.patientForm.helpers({ 
    birthDate() { 
     return Template.instance().birthDate.get() 
    } 
}); 

Template.patientForm.events({ 
    'click something'(event, instance){ 
    .... 
    instance.birthDate.set(value); 
    .... 
    } 
}); 
2

您不能直接修改模板數據(可以,但這不是被動的,將被覆蓋)。你從哪裏獲得模板數據?一個集合?一個無功變量?如果是這樣,修改那裏的數據 - Blaze會注意到這個變化並重新渲染。

據說這樣的事會工作:

Patients.update(templateInstance.data._id, {$set: { 
    birthDate: .., 
    gender: .. 
}}); 
+0

這是addPatient窗體。我想根據文本框的值自動填充另外兩個字段。 – vijayst