gpt4 book ai didi

javascript - Meteor.js 中应用程序/用户设置的最佳实践是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 05:50:11 25 4
gpt4 key购买 nike

我查看了相当多的 Meteor 示例,这些示例展示了如何实现应用程序设置和用户特定设置。我唯一找到的是 Telesc.pe .它使用 Settings 集合。但是,它只有一个全局(对每个人都一样)的应用程序设置。

在该示例的基础上,我创建了我自己的 settings 集合,它在服务器和客户端上都可用。

// Server and Client
Settings = new Meteor.Collection('settings');

在每个Settings 记录中都有一个userId 字段,它等于'Default' 或用户的id。

{
...
userId: 'Default' // <-- 'Default' or Meteor.userId()
}

我有我的发布功能发布默认(应用程序)设置和用户设置。 (旁注:在此应用程序中,每个人都已登录,不允许访客)

// Server
Meteor.publish('settings', function() {
return Settings.find({userId: {$in: [this.userId, 'default']}});
});

这里的想法是,用户将使用默认设置,直到他们更改设置,从而减少集合中的记录数。

我还尝试抽象掉很多乏味的东西,并创建一些助手来为用户获取和设置设置。

// Server and Client

// get user specific settings, fallback to default settings
// (not sure if this is the best way, but it works)
settings = function() {
return Settings.findOne({userId:Meteor.userId()})
|| Settings.findOne({userId:'default'});
};

// Get value of a specific setting
getSetting = function(key) {
return Session.get('settingsLoaded') ? settings()[key] : undefined;
};

// Set value of a specific setting
setSetting = function(key, value) {
// bunch of logic here to see if a user specific record exists
// if so, do update
// if not, do insert
};

到目前为止,这个实现似乎运行良好。我可以通过 m 辅助函数在控制台中设置和获取设置。

// in the console...
setSetting('foo', 'bar');
getSetting('foo') // == 'bar'

当我开始根据某些设置让我的应用程序以不同方式运行时,就会出现我遇到的问题。例如,我有一个名为“phrases”的模板,其中包含一个名为“phrases”的变量。我想根据用户的设置更改它们的排序方式。

Template.phrases.phrases = function () {
var sort = {};

var sortKey = getSetting('sortPhrasesBy'); // if I console.log this it is ALWAYS equal to 'title', 'body', or 'date', which is what I want.
sort[sortKey] = 1;

// returns cursor with all phrases, sorted
return Phrases.find({}, {sort:sort});
};

除了我不断收到 Deps 异常,我不知道哪里出了问题。

Exception from Deps recompute: TypeError: Cannot read property 'nodeName' of null
at Patcher.match (http://localhost:3000/packages/spark.js?3a050592ceb34d6c585c70f1df11e353610be0ab:1540:12)
at http://localhost:3000/packages/spark.js?3a050592ceb34d6c585c70f1df11e353610be0ab:1364:23
at visitNodes (http://localhost:3000/packages/spark.js?3a050592ceb34d6c585c70f1df11e353610be0ab:1320:11)
at visitNodes (http://localhost:3000/packages/spark.js?3a050592ceb34d6c585c70f1df11e353610be0ab:1321:9)
at visitNodes (http://localhost:3000/packages/spark.js?3a050592ceb34d6c585c70f1df11e353610be0ab:1321:9)
at visitNodes (http://localhost:3000/packages/spark.js?3a050592ceb34d6c585c70f1df11e353610be0ab:1321:9)
at visitNodes (http://localhost:3000/packages/spark.js?3a050592ceb34d6c585c70f1df11e353610be0ab:1321:9)
at patch (http://localhost:3000/packages/spark.js?3a050592ceb34d6c585c70f1df11e353610be0ab:1334:3)
at http://localhost:3000/packages/spark.js?3a050592ceb34d6c585c70f1df11e353610be0ab:698:7
at LiveRange.operate (http://localhost:3000/packages/liverange.js?b3097d72d458e645fd4f0021c8ff5189abe8d98a:491:9)

我不知道是什么原因造成的。 :/

但是,这段代码确实有效!它确实根据用户设置的内容对短语进行排序。但是在控制台中,我可以看到每次更改设置时都会抛出此异常。第一次加载没问题。

那么,我在这里做错了什么吗?我必须承认,我还没有完全理解 Meteor 在幕后所做的事情。

不知道有没有用。但在尝试实现设置集合之前,我使用了 Session 对象。所以我有这样的事情:

// on client
Session.setDefault('sortPhrasesBy', 'title);

Template.phrases.phrases = function () {
var sort = {};

var sortKey = Session.get('sortPhrasesBy');
sort[sortKey] = 1;

// returns cursor with all phrases, sorted a certain way
return Phrases.find({}, {sort:sort});
};

这没有问题。它只是不够灵活。

还有其他方法吗?如果有人碰巧知道的话,我很想知道 build meteor 的人正在为个人测试/项目中的设置做些什么。

抱歉发了这么长的帖子,我试图预测可能会问我已经尝试过的问题等等。

感谢您提供的任何帮助!

最佳答案

Meteor 帐户系统(例如帐户密码)具有内置用户特定设置的概念,作为用户对象的“配置文件”字段。它是自动发布的,也是响应式(Reactive)的(因为 Meteor.user() 是响应式(Reactive)的)。

以下是相关文档:http://docs.meteor.com/#meteor_user

关于“nodeName”错误,它很难调试,但通常当我收到该错误时,是因为我试图访问实际上并不存在的模板助手中的 DOM 部分。当我不小心有两个具有相同 ID 的 DOM 元素时,我也看到过它(使用子模板很容易做到)。

为了追踪它,我删除了代码,直到它不再发生,然后逐个添加回来,直到找到根本原因。

关于javascript - Meteor.js 中应用程序/用户设置的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18578556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com