【问题标题】:how to create a global variable for every entrance to the website?如何为网站的每个入口创建一个全局变量?
【发布时间】:2016-03-07 22:04:44
【问题描述】:

我有一个工作得很好的全局数组,并在我单击表单中的提交后存储用户选择的图像的 URL。

问题是当我想提交另一个表单时,全局数组仍然会有之前提交的 URL。

我想要做的是为每个用户创建一个数组来存储他的 URL,当他单击提交时,该数组将被删除或删除。所以如果有多个用户使用同一个函数,每个人都会有自己的数组来存储他的 URL

我该怎么做?

这是我尝试过的,但是当我点击表单页面上的提交时,没有任何反应

首先,这是返回用户选择图像的url的方法,该方法存在于两个文件夹(both/file.js)中

storeUrlInDatabaseSS: function( url ) {
    check( url, String );
    Modules.both.checkUrlValidity( url );

    try {
      return url;
     } catch( exception ) {
      return exception;
    }
  }

然后我在客户端 (client/file.js) 中创建了会话变量

Session.set("screenshots", []);
Session.set("i", 0);

var screenshots = Session.get("screenshots");
var i = Session.get("i");

在这里我将 url 存储在数组中

let _addUrlToDatabaseSS = ( url ) => {
  screenshots[i++] = url;
  Session.set("screenshots", screenshots);
};

我正在使用Meteor Collection Hook Package

我添加了这两行代码,用户按下提交后应该会感到兴奋,它们存在于“client/files.js”目录中

Products.before.insert(function (userId, doc) {
  doc.screenShots = Session.get("screenshots");
});

现在每当我点击提交时,什么都没有发生,我认为问题是因为这里的集合中的 screenShots 属性中实际上没有存储任何内容

  screenShots: {
    type: [String]
  },

当我将 screenShots 属性默认设置为空数组时,如下面的代码,提交按钮起作用

  screenShots: {
    type: [String],
    autoValue: function() {
      return [];
    }
  },

我尝试使用 AutoForm.hooks 的另一种方式

AutoForm.hooks({
    submitPostForm: {
        before: {
            insert: function(doc) {
                doc.$set.screenShots = Session.get("screenshots");
            }
        }
    }
});

这是我在 .html 文件中的表单

{{> quickForm collection="Products" id="submitPostForm"
  type="method" meteormethod="submitPost" omitFields="createdAt, previewImage, screenShots, sourceCode, userID"}}

这是用户提交表单后触发的方法,它存在于服务器端。

submitPost: function (app) {
    // Console.log('new App:', app);
    check(app, {
        title: String,
        description: String,
        category: String,
        price: Number
    });
    Products.insert(app);
}

由于某种原因,我的 before 钩子不起作用,我不明白为什么! 我在这里做错了什么?

【问题讨论】:

  • 抱歉,在我看来您正在寻找收藏品,但您的问题不太好理解。请重写您正在寻找的内容,而不是您已经尝试过的内容。
  • 为什么不使用Session 来存储用户特定的信息?即使是在客户端声明的全局数组对每个用户都是唯一的。那么你的问题到底是什么?
  • @BlazeSahlzen 我可以使用 Session 专门为每个用户创建一个全局数组吗?如果是,请你告诉我怎么做?因为这就是我真正想要的
  • @TomFreudenberg 我想专门为每个用户创建全局数组,因为我的数组现在用于整个系统。我会修改问题
  • 以您正在寻找什么样的解决方案的方式修改问题:例如“每个用户都应该能够上传和描述基于 url 的屏幕截图”或描述性的东西。

标签: meteor meteor-autoform


【解决方案1】:

为每个用户创建一个全局数组的一种方法是使用Session。这样也可以持久化跨应用程序的数据(仅限客户端)。

使用Session 的简单方法如下:

  1. Session 中创建一个名为url_list 的数组:

    Session.set("url_list", []);

  2. Session检索数组:

    var url_list = Session.get("url_list");

  3. url_list进行更改:

    url_list.push(someData);

  4. url_list 再次存储在Session 中:

    Session.set("url_list", url_list);

注意Session只能在客户端使用,所有相关代码都应该在客户端。

More about Session.

将数据保存到服务器端

url_list 持久化到服务器的最佳方法是将一个新文档插入到包含Session 数据的数据库集合中。

insertToDB = function() {

    var url_list = Session.get('url_list');
    Products.insert({
        'url_list': url_list
    });
    Session.set('url_list', []); // To empty the client-side list

}

【讨论】:

  • 有没有办法在同时在客户端和服务器上运行的代码上执行此操作?因为我在客户端和服务器上运行的代码上使用全局数组(两个目录)
  • 因为我在我的集​​合中返回 Session 变量的值,并且在我的服务器端使用该集合,所以我需要它在客户端和服务器上都可用,是否可以这样做?
  • 您的问题并未反映出该代码旨在同时在客户端和服务器上运行。所以我认为它是为客户准备的。 Session 只是客户端。所以我们必须找到另一种方法来解决它。将更新我的答案。
  • 是的,我应该提到它,我是新的流星,刚刚潜入,所以我不知道会话。我找到了一个正在尝试实施的解决方案,如果可行,将在此处发布,非常感谢您的帮助
  • 好的,试试你的解决方案。如果您遇到困难,我们随时为您提供帮助。
猜你喜欢
  • 2022-07-12
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多