Meteor / Mongo - 从模板中检索_id以在函数

时间:2016-02-05 03:10:14

标签: mongodb meteor

我是编程的新手,如果这看起来显而易见,那就道歉了。我已经花了相当长的时间在这之前询问,所以我希望这没关系。

我正在尝试检索mongo文档的ID,以便我可以更新它(通过表单)。

我将展示到目前为止我所拥有的:

铁路由器通过网址将我带到页面:

Router.route('companyDetails', {
name: 'companyDetails',
template: 'companyDetails'

});

显示mongo文档的模板(它确实有效):

<template name = "companyDetails">
<h3>Update your Company Details</h3>
<form class = "companysave">
    <dl>
        {{#each company}}
            id is: {{_id}}<br>
            <p><input type = "text" value="{{name}}" name="companyName" size="35"></p>
            <p><input type = "text" placeholder="{{phone}}" name="companyPhone" size="35"></p>
            <p><input type = "text" placeholder="{{web}}" name="companyWeb" size="35"></p>
            <p><input type = "text" placeholder="{{twitter}}" name="companyTwitter" size="35"></p>
            <p><input type = "text" placeholder="{{facebook}}" name="companyFacebook" size="35"></p>
        {{/each}}
    </dl>
    <p><input type="submit" value="Reset">
    <input type="submit" value="Update"></p>
</form>

模板助手将文档数据发送到模板:

Template.companyDetails.helpers({
    'company': function(){
        return Organisations.find();            
    }
})

试图获取文档ID以将更新的信息发送到服务器上的方法的模板:

Template.companyDetails.events({

    'submit form': function(event){
        event.preventDefault();

        var documentId = this._id;

        var name = $('[name=companyName]').val();
        var web = $('[name=companyWeb]').val();
        var twitter = $('[name=companyTwitter]').val();
        var facebook = $('[name=companyFacebook]').val();
        Meteor.call('updateCompanyDetails', documentId, name, web, twitter, facebook);
    }

});

我也有一个服务器方法,但我目前在模板事件中遇到了上述函数。

我收到的错误基于:

var documentId = this._id;

它来自未定义。有趣的是,如果你看一下模板本身,我正在编写一些名为:

的调试信息
    id is: {{_id}}<br>

并显示正确的ID。所以模板有ID。它加载并显示mongo文档中的数据,但我无法从模板事件中检索它。

有人可以提供一些关于我在这里做错的建议吗?

同样,我是新手(以及一般的编程),所以这可能是一个很轻松的时刻。

非常感谢,Rob

1 个答案:

答案 0 :(得分:3)

根据您的方法调用,您似乎只想更新此页面上的某个特定公司,并且只会在.find()中返回一个。如果不是这样,您需要更新您的出版物和您的路线,只返回一个组织。以下是根据我的假设使事情有效的代码:

<template name = "companyDetails">
    <h3>Update your Company Details</h3>
    {{#with company}}
        <form class = "companysave">
            <dl>
                id is: {{_id}}<br>
                <p><input type = "text" value="{{name}}" name="companyName" size="35"></p>
                <p><input type = "text" placeholder="{{phone}}" name="companyPhone" size="35"></p>
                <p><input type = "text" placeholder="{{web}}" name="companyWeb" size="35"></p>
                <p><input type = "text" placeholder="{{twitter}}" name="companyTwitter" size="35"></p>
                <p><input type = "text" placeholder="{{facebook}}" name="companyFacebook" size="35"></p>
            </dl>
            <p><input type="submit" value="Reset">
            <input type="submit" value="Update"></p>
        </form>
    {{/with}}
</template>

Template.companyDetails.helpers({
    'company': function(){
        return Organisations.findOne();            
    }
});

我将find()更改为findOne()以确保只返回一个文档。然后我将你的#each切换到#with,以确保我们只使用帮助器中返回的一个文件。我还将#with移到了表单元素之外。这很重要,因为它在您的提交事件中设置了this的数据上下文。您需要查看meteor guide以获取有关其中一些概念的帮助。希望有所帮助!