เรนเดอร์เทมเพลต Blaze อีกครั้งเมื่อเปลี่ยนข้อความ

ฉันมีเทมเพลต Meteor 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 เปลี่ยนแปลง อย่างไรก็ตาม เพศและวันเกิดที่แก้ไขจะไม่แสดงผลซ้ำในเทมเพลตรูปแบบอัตโนมัติ / Blaze ด้วยวิธีใดที่ฉันสามารถบังคับให้แสดงเทมเพลต Blaze อีกครั้งหรือวิธีอื่นในการเปลี่ยนแปลงการควบคุมอื่น ๆ ในเทมเพลต Blaze


person vijayst    schedule 31.10.2016    source แหล่งที่มา


คำตอบ (2)


หากต้องการเปิดใช้งานปฏิกิริยาและการเรนเดอร์ฟิลด์ใหม่คุณควรใช้ 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);
   ....
   }
});
person Xander    schedule 01.11.2016

คุณไม่สามารถแก้ไขข้อมูลเทมเพลตได้โดยตรง (คุณสามารถทำได้ แต่จะไม่เกิดปฏิกิริยาและจะถูกเขียนทับ) คุณได้รับข้อมูลเทมเพลตจากที่ไหน? คอลเลกชัน? ตัวแปรปฏิกิริยา? หากเป็นเช่นนั้น ให้แก้ไขข้อมูลที่นั่น Blaze จะสังเกตเห็นการเปลี่ยนแปลงและแสดงผลอีกครั้ง

สมมุติว่าสิ่งนี้จะได้ผล:

Patients.update(templateInstance.data._id, {$set: {
  birthDate: ..,
  gender: .. 
}});
person Christian Fritz    schedule 31.10.2016
comment
นี่คือแบบฟอร์ม addPatient ฉันต้องการเติมข้อมูลอีกสองฟิลด์โดยอัตโนมัติตามค่าของกล่องข้อความ - person vijayst; 31.10.2016