【问题标题】:Meteor upload clearing/resetting form data流星上传清除/重置表单数据
【发布时间】:2016-03-31 04:46:31
【问题描述】:

问题:流星中的表单数据是使用链接点击设置的,但在点击新链接时不会重置/更新。这会导致所有以下链接点击指向初始点击的文档(而不是新点击的文档),因为每次点击后 formData 不会更新/重置

我有一个测试 web 应用程序 (http://meteorpad.com/pad/ckgN6GL4msQn4Ms5h/Jobs),其中导航菜单中的链接从集合中调用不同的文档并显示数据

部分数据显示是上传部分。单击链接时,该文档的 id 存储在会话变量中。然后将其作为 id 在 formData 中传递,以便上传者可以创建一个与文档 id 同名的目录。为该文档上传的文件然后存储在该特定文件夹中

这适用于我点击的第一个链接。文件被上传到带有其名称的子目录。但是,当我单击新链接时,我上传的所有文件都会上传到第一个文档目录

我相信这是因为表单没有重新加载,因此 formData 仍然具有第一次点击的文档链接的 id。

通过这种设置,我如何在点击链接时重置表单数据,以便它始终传递最新的 id,而不是第一个?

在这段代码中,当一个链接被点击时,它的 ID 被存储在一个会话变量中:

Template.job.events({
        "click #jobItem": function(event){
            Session.set("selectedJob", this._id);
        }
    });

文档信息以这样的模板显示:

<template name="summary">
  {{#with summary}}
  <div id="summaryContainer">
    <p>Name: {{name}}</p>
    <p>Created at: {{createdAt}}</p>
    <p>Username: {{username}}</p>
    <p>Script location:</p>
    {{> upload_bootstrap multiple=false formData=specificFormData}}
    <p>Upload file location:</p>

    <button class="deleteJob">Delete Job</button>
    <button class="saveJob">Save</button>
    <button class="startJob">Start</button>
  </div>
  {{/with}}
</template>

所以上传表单名为specificFormData,这是一个摘要模板帮助函数:

Template.summary.helpers({
        summary: function(){
            var curJob = Session.get("selectedJob");
            return Jobs.findOne( { _id:curJob } );
        },

        specificFormData: function(){
            return({
                id: Session.get("selectedJob")
            })
        }
    });

上传器定义使用从会话变量中提取的 formData ID 创建一个子目录:

Meteor.startup(function () {
    var dir = '/job/';

    UploadServer.init({
        uploadDir: process.env.PWD + dir,
        tmpDir: process.env.PWD + dir + 'tmp/',
        checkCreateDirectories: true,
        getDirectory: function(fileInfo, formData){
            return formData.id;
        }
    });
});

因此,当第一次单击作业时,会存储一个会话变量。然后,显示页面仅从集合中提取该文档信息。表单数据存储 ID 并使用作业 ID 创建子目录。再次单击链接时,表单数据 ID 不会重置,并尝试上传到相同的先前目录,而不是新单击的文档目录。 它应该根据点击的作业上传到不同的子目录

【问题讨论】:

  • 我已经尝试了几乎所有我能想到的一切,但没有运气。我确实发现,在选择上传任何内容之前,您可以在作业之间切换,并且上传表单中的“data-form-data”属性(检查浏览按钮)会发生变化。在您选择要上传的文件后,该值在您重新加载页面之前是不可更改的。我很确定如果你使用路由器,你可以解决这个问题(flow routeriron router

标签: javascript mongodb meteor


【解决方案1】:

我认为这是一个错误,根据this issue,它应该已在tomi:upload-jquery v2.2.0 中修复,但它似乎仍在发生,如您的示例所示。

这是另一种解决方案。使用callbacks 代替formData 并添加一个回调函数,将表单数据作为模板助手。

main.html

<template name="summary">
    {{> upload_bootstrap multiple=false callbacks=myCallbacks}}
</template>

common.js

Template.summary.helpers({
    myCallbacks: function() {
        return {
            formData: function() { return({id: Session.get("selectedJob")}) }
        }
    }
});

【讨论】:

  • 很好地发现了这个错误。我尝试了回调解决方案,但无法正常工作。你可以开始工作了吗?
  • 是的,回调工作正常。这是@Simon 的repo 的固定版本:meteorpad.com/pad/j7XDhrDdWJeTRsH5c/Jobs-Fix。您必须下载它自己进行测试,因为 Simon 没有包含任何测试。
  • 我遇到了完全相同的问题。我从输入和选择框中设置了两个不同的会话变量。我监听更改事件并相应地设置变量,但上传器实际上并没有发送数据。当我单击“浏览...”按钮时,在会话变量中设置的任何值都将被发送到服务器。有什么线索吗?
  • @vinzenzweber 上次我检查时,该方法只允许您附加一次文件并且您无法覆盖它。但是,您可以使用我在帖子中提到的回调来覆盖它。
  • 我创建了一个拉取请求来解决这个问题:github.com/tomitrescak/meteor-tomi-upload-jquery/pull/9
猜你喜欢
  • 2017-06-17
  • 2016-02-28
  • 2013-09-10
  • 2014-03-24
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
相关资源
最近更新 更多