You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Meteor中表格每行编辑模态框显示相同合同问题求助

It sounds like your modal is using a static or incorrectly bound data context that doesn't update when you click different rows. This is a common issue when working with dynamic modals in Meteor—let's fix it step by step.

The Root Cause

Your current setup probably isn't tracking which specific contract was clicked, so the modal always falls back to the same (likely first) contract in your collection. We need a way to reactively store the selected contract and bind that to the modal.

Step 1: Add a Reactive Variable to Track the Selected Contract

First, we'll use a ReactiveVar (component-scoped state, better than Session for this use case) to hold the contract we want to edit. Add this to your template's onCreated hook:

Template.ContractsList.onCreated(function() {
  // Initialize with null to avoid showing stale data
  this.currentContract = new ReactiveVar(null);
});

Step 2: Update the Button Click Event to Set the Selected Contract

Next, modify your click event for the update button to capture the clicked contract and set it in the reactive variable:

Template.ContractsList.events({
  'click .update-button'(event, template) {
    // "this" refers to the contract document from your #each loop
    const selectedContract = this;
    
    // Set the reactive variable to the clicked contract
    template.currentContract.set(selectedContract);
    
    // Show your modal (adjust the selector to match your modal's ID)
    $('#editContractModal').modal('show');
  },
  
  // Optional: Clear the selected contract when the modal closes
  'hidden.bs.modal #editContractModal'(event, template) {
    template.currentContract.set(null);
  }
});

Step 3: Add a Helper to Fetch the Selected Contract

Replace your incomplete list helper with one that returns the reactive contract:

Template.ContractsList.helpers({
  lists: function() {
    Meteor.subscribe('listsMethod');
    return Contracts.find({});
  },
  // New helper to get the currently selected contract
  currentContract() {
    return Template.instance().currentContract.get();
  }
});

Step 4: Bind the Modal to the Selected Contract

Update your modal template to use the currentContract helper, so it only shows data when a contract is selected:

<!-- Inside your ContractsList template -->
<div class="modal" id="editContractModal">
  <div class="modal-content">
    {{#with currentContract}}
      <h3>Edit Contract: {{contractName}}</h3>
      <form>
        <input type="text" value="{{contractName}}" name="contractName" />
        <!-- Add other contract fields here, bound to the current contract -->
        <button type="submit" class="save-contract">Save Changes</button>
      </form>
    {{/with}}
  </div>
</div>

Step 5: Handle Saving the Edited Contract

Add an event to save the changes back to the collection:

Template.ContractsList.events({
  'submit form'(event, template) {
    event.preventDefault();
    
    const currentContract = template.currentContract.get();
    if (!currentContract) return; // Exit if no contract is selected
    
    // Get form values (adjust fields to match your contract schema)
    const updatedData = {
      contractName: event.target.contractName.value,
      // Add other fields here
    };
    
    // Update the contract in the database
    Contracts.update(currentContract._id, { $set: updatedData });
    
    // Close the modal
    $('#editContractModal').modal('hide');
  }
});

Key Notes

  • Make sure your update button is inside the {{#each lists}} loop so this correctly refers to the individual contract document.
  • Using ReactiveVar ensures the modal reacts immediately when a different contract is selected.
  • Clearing the reactive variable on modal close prevents stale data from showing if the modal is opened again without selecting a new contract.

This setup will ensure each button click loads the correct contract into the modal.

内容的提问来源于stack exchange,提问作者Ilyes Atoui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:23:28