【问题标题】:collection.findOne() return the same value for each item of a tablecollection.findOne() 为表的每个项目返回相同的值
【发布时间】:2018-03-27 10:22:11
【问题描述】:

我知道我的问题有点愚蠢,但我被困住了。 我有一张合同表,每一行都有一个更新按钮; 当我单击该按钮时,会显示一个包含合同编辑表单的模式。 一切正常,但我的问题是模式为每一行显示相同的合同。 更多描述,这是一个截图

这个是模态的

这是我的模板助手

    Template.ContractsList.helpers({
    lists: function() {
        Meteor.subscribe('listsMethod');
        return Contracts.find({});

    },
    list: function() {
        return Contracts.findOne();

    }
});

这是我的模板事件

Template.ContractsList.events({
    'click #editContract'(event) {
        $("#showModal").modal("show");
        console.log( Contracts.findOne({_id: this._id}) );


    },

    'click #hideModal'(event) {
        $("#showModal").modal("hide");
    },

});

这是我的模板

<template name="ContractsList">

    <div class="modal fade" id="showModal">
        <div class="modal-dialog modal-sm">
            <div class="modal-content">
                <div class="modal-header">
                    <h4 class="modal-title">edit</h4>
                </div>
                <div class="modal-body">

                    <div class="card-body">
                        {{#with list}}
                        <div class="form-group">
                            <label  class="select">Name</label>
                            <input type="text" class="form-control"  aria-describedby="emailHelp" value={{name}} />&nbsp;
                        </div>
                            <div class="form-group">
                                <label  >Package</label>
                                <div >
                                    <select id="role" name="select" class="form-control" >
                                        <option  value="package" selected disabled hidden >{{package}}</option>
                                        <option value="freemium">freemium</option>
                                        <option value="bronze">bronze</option>
                                        <option value="silver">silver</option>
                                        <option value="gold">gold</option>
                                        <option value="platium">platium</option>
                                    </select>
                                </div>
                            </div>
                        {{/with}}
                    </div>
                </div>
                <div class="modal-footer">
                    <Button class="primary" >Create contact</Button>
                    <Button class="secondary" id="hideModal">Cancel</Button>
                </div>
            </div>
        </div>
    </div>
    <div class="breadcrumb">
        <div class="table-responsive">
            <table class="table">
                <thead>
                <tr>

                    <th>Name</th>
                    <th>Package Type</th>
                    <th>Actions</th>
                </tr>
                </thead>
                <tbody>
                {{#each lists}}
                    <tr>
                        <td>
                            {{name}}
                        </td>
                        <td>
                            {{package}}

                        </td>
                        <td>
                            <Button class="btn btn-outline-primary" id="editContract"><img src="../../../../../img/icons/addcontact-icon.png" /></Button>&nbsp;&nbsp;
                        </td>
                    </tr>
                {{/each}}
                </tbody>
            </table>
        </div>
    </div>
</template>

在模板事件的控制台日志中,我得到了我想要的正确数据

{_id:“Qu8pTSzLDLGKRNRzd”,名称:“ilyes”,包:“青铜”} {_id: “w7NDzerxivAjhK3dy”,名称:“ee”,包:“freemium”}

我该怎么办?

【问题讨论】:

  • findOne 仅获取查询的第一个结果(如果可用)。如果您不提供像 id 这样的条件,您将获得与所有记录匹配的查询的第一个结果,因此这是意料之中的。如果您想获取特定项目,请在 list 助手中添加一个参数。
  • 但是如何将 id 从事件传递到帮助列表?

标签: meteor


【解决方案1】:

在您的点击处理程序中设置一个Session 变量(或reactiveVar),然后在您的list 助手中使用它:

事件处理程序:

'click #editContract'(event) {
  $("#showModal").modal("show");
  console.log( Contracts.findOne({_id: this._id}) );
  Session.set('currentRecordId',this._id);
},

助手:

list() {
    return Contracts.findOne(Session.get('currentRecordId');
}

【讨论】:

  • 感谢它的工作:D,但是除了会话之外还有其他方法吗?
  • @IlyesAtoui:正如 MichelFloyd 所解释的,您可以改用ReactiveVar,这是相同的想法,但不是在应用程序级别。这两种解决方案都利用了 Meteor 和 Blaze 的反应性。老式的方法是“手动”重建/重新分配您的活动中的模态输入内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多