【问题标题】:Meteor + Aldeed Autoform :: How to pass parent data?Meteor + Aldeed Autoform :: 如何传递父数据?
【发布时间】:2015-06-08 21:30:53
【问题描述】:

所以在我的页面上,有一个从Books 集合中呈现的不同书籍的列表。

对于每本书,都有一个表格可以添加有关借书人的一些信息。

我目前的模板结构如下:

<template name="bookList">
{{#each book}}
    <div class="book">
    ...
    </div>
    {{> borrowerForm}}
{{/each}}
</template>

<template name="borrowerForm">
    <div class="borrowerForm">
    {{#autoForm schema=borrowerFormSchema id="borrowerForm" type="method" meteormethod="addBorrower" class="hide"}}
    </div>
{{/each}}
</template> 

我将type="method" 用于此“借款人”表单,以便我可以使用附加对象修改doc(也称为表单输入值)。

这是我目前的做法:

Meteor.methods({
    addBorrower: function(doc) {
        if (! Meteor.userId()) {
            throw new Meteor.Error("not-authorized");
        }
        Meteor.users.deny({
            insert: function() {
                return true;
            }
        });
        check(doc, Schemas.borrowerSchema);

        var myData = doc;

        //var bookID = Template.parentData(1)._id;
        //console.log("bookID: " + bookID);

        //myData["bookID"] = bookID;  
        myData["createdBy"] = Meteor.userId();
        myData["createdAt"] = new Date();

        Borrower.insert(myData);
    }
});

一切似乎都很好,直到我需要再添加一件事,即图书 ID。我想在 createdBycreatedAt 旁边包含正在借阅的图书 ID 作为附加数据。

我获取图书 ID 的方法是使用 Template.parentData(1)._id,它确实返回了正确的数据(请参阅上面代码中的注释行)。但是,它抛出了这个我不明白的错误,并且表单根本不会提交:

M…r.m…e.errorClass {
      error: 500, 
      reason: "Internal server error", 
      details: undefined, 
      message: "Internal server error [500]", 
      errorType: "Meteor.Error"
}
 details: undefined
 error: 500
 errorType: "Meteor.Error"
 message: "Internal server error [500]"
 reason: "Internal server error"stack: (...)
 ▶︎ get stack: () { [native code] }
 ▶︎ set stack: () { [native code] }
 ▶︎ __proto__: Meteor.makeErrorType.errorClass

终端:

  Exception while invoking method 'addBorrower' ReferenceError: Template is not defined
      at [object Object].Meteor.methods.addBorrower (app/common/books.js:42:31)
      at maybeAuditArgumentChecks (packages/ddp/livedata_server.js:1617:1)
      at packages/ddp/livedata_server.js:648:1
      at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1)
      at packages/ddp/livedata_server.js:647:1
      at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1)
      at [object Object]._.extend.protocol_handlers.method (packages/ddp/livedata_server.js:646:1)
      at packages/ddp/livedata_server.js:546:1

有人能解释一下那里发生了什么以及如何解决这个问题吗?谢谢!

我是 Javascript 和 Meteor 的新手,因此也非常感谢您提供简单但清晰的解释(带有类比)。

【问题讨论】:

  • 你好,你的Meteor.methods是在服务器目录还是客户端目录的文件中?获取图书 ID 的方法有多种。
  • 我将 Meteor.methods 放在一个可供客户端和服务器访问的文件夹中。

标签: javascript meteor meteor-autoform


【解决方案1】:

首先将您的方法移动到server/ 文件夹中的文件中。另外,将您的拒绝规则移到方法之外。

现在,在您的 borrowerForm.onRendered 中创建一个 AutoForm 挂钩,例如:

AutoForm.hooks({
    borrowerForm: {
        before: {
            method: function( doc ) {
                doc.bookID = Template.parentData(1)._id;
                return doc;
            }
        }
    }
});

这应该可以,不过我还没有尝试过。如果还是不行,请将您的代码放在 MeteorPad 上并发布链接。

【讨论】:

  • 似乎无法让它工作 = / 尝试过 MeteorPad,但它对我来说有问题。请查看此 repo:bitbucket.org/kyooriouskoala/library/branch/master
  • 嘿,我已经解决了这个问题,请检查bitbucket.org/keya/library 出于某种原因,beforemethod 不起作用,所以使用了formToDoc
  • 另外,请考虑使用 github.com/iron-meteor/iron-cli 之类的东西来组织您的代码。花在弄清楚如何组织文件上的时间要少得多,这完全可以提高您的工作效率。
  • 我去看看 Iron-cli!谢谢你的帮助!感谢您提供的解决方案,我将使用它继续构建应用程序以了解有关 Meteor 和 JS 的更多信息。不过,您是否知道我最初的做法出了什么问题?
  • 调用在服务器端执行,模板上下文未知。据我所知,Template 对象在客户端可用。此外,当您进行方法调用时,您只是将数据作为参数传递给它,模板的上下文几乎是未知的,因此您必须在客户端助手上获取它并将其适当地传递给服务器方法。当你尝试更多的事情时,一切都会变得更加明显:)
猜你喜欢
  • 1970-01-01
  • 2015-10-04
  • 2015-02-28
  • 2016-01-31
  • 2019-01-08
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
相关资源
最近更新 更多