使用Meteor,我试图了解何时使用服务器端,Meteor.methods()同时仍保留即时UI更新.
从Andrew Scala的介绍性教程中,他声称Meteor.methods()应该在您想要更新和修改数据库文档时使用:
我们的想法是,您定义服务器上执行修改和更新数据等危险内容的所有功能,然后让客户端调用这些函数并获取常规函数等返回值.客户端永远不会看到实现,也不会亲自修改数据.服务器完成所有工作.
遵循这个建议,我在我的代码中实现了这个:
服务器端:
Meteor.methods({
addMovie: function(data) {
var movie = Movies.insert({name: data});
return movie;
},
...
Run Code Online (Sandbox Code Playgroud)
客户端:
Template.movies.events = ({
'click #add-movie': function(e) {
var name = document.getElementById('movie-name').value;
Meteor.call('addMovie', name);
return false;
},
...
Run Code Online (Sandbox Code Playgroud)
这有效,但速度很慢.UI不会像Movies.insert()在客户端调用时那样立即更新.该文件表明,以纠正问题,您可以创建在客户端存根:
客户端上的调用方法定义与同名服务器方法关联的存根函数.如果您不希望,则不必为方法定义存根.在这种情况下,方法调用就像其他系统中的远程过程调用一样,您必须等待服务器的结果.
但这些存根应该是什么样的?它应该与服务器端方法基本相同吗?如果是这样,重点是什么?我正在寻找关于Meteor.methods()存根的使用和目的,点/使用及其实现的更全面的解释.
编辑:大卫格林斯潘已帮助阐明Meteor.methods()和存根在流星谈话中的使用.
使用Meteor,我正在尝试执行如下更新:
Items.update(Session.get('selectedItem'), {'$set': {'directions.0.name': area.value}})
Run Code Online (Sandbox Code Playgroud)
但我正在努力如何动态设置方向的数组索引,如下所示:
var index = //a value determined dynamically
Items.update(Session.get('selectedItem'), {'$set': {'directions[index]name': area.value}})
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为[index]包装在一个字符串中.我还试图形成一个自定义字符串,如下所示:
var string = 'directions.'+itemIndex+'.name'
Items.update(Session.get('selectedItem'), {'$set': {string: area.value}})
Run Code Online (Sandbox Code Playgroud)
但这不起作用.有关如何做到这一点的任何想法?
使用Meteor,我想知道如何最好地处理共享相同服务器端数据库集合的不同客户端集合.考虑以下示例:我有一个User集合,在我的客户端,我有一个朋友用户列表,我有一个搜索功能,对整个用户数据库执行查询,返回与查询匹配的用户名列表.
在发布服务器端方法上,我对同一个集合有两个查询,它们返回不同的文档集.这些数据应该在客户端分成两个独立的集合吗?或者,与两个查询匹配的所有用户文档是否最终都在同一个集合中?如果是后者,我会重复用于服务器端和客户端查询的代码吗?
在服务器上:
Meteor.publish('searchResults', function(query){
var re = new RegExp(query, 'i')
return Users.find({ 'name' : {$regex: re}})
})
Run Code Online (Sandbox Code Playgroud)
在客户端:
Session.set('searchQuery', null)
Meteor.autosubscribe(function(){
Meteor.subscribe('searchResults', Session.get('searchQuery'))
})
Template.search.events = {
'keyup #user-search' : function(e){
Session.set('searchQuery', e.target.value)
}
}
_.extend(Template.search, {
searchResults: function() {
var re = new RegExp(Session.get('searchQuery'), 'i')
return Users.find({ 'name' : {$regex: re}})
}
})
Run Code Online (Sandbox Code Playgroud)
这似乎是一个看似合理的解决方案,但不是最佳解决方案.如果我想创建一个新的客户端集合,该集合由来自多个服务器端集合的搜索结果组成,该怎么办?
我希望根据提供的对象的内容创建静态文本文件,然后由用户下载.这是我计划做的事情:
当用户点击"导出"时,应用程序会调用Meteor.method(),然后使用典型的Node方法将文件解析并写入公共目录.
创建文件后,在回调中Meteor.method()我提供了生成文件的链接.例如,'public/userId/file.txt'.然后,用户可以选择在该链接下载文件.
然后我使用Meteor Connect modele(它在内部使用)将对上述URL的任何请求路由到文件本身.我可以根据userId和用户的登录状态进行一些权限检查.
问题:当公共生成静态文件时,网页每次都会自动重新加载.我认为使用像Express这样的东西来生成一个REST端点更有意义,它可以处理创建文件.但是,如果我无法访问Meteor会话数据,那么我不确定如何处理权限.
关于最佳策略的任何想法在这里?
我正在尝试使用GraphQL与GraphiQL接口进行简单的变异.我的突变看起来像这样:
mutation M($name: String) {
addGroup(name:$name) {
id,
name
}
}
Run Code Online (Sandbox Code Playgroud)
变量:
{
"name": "ben"
}
Run Code Online (Sandbox Code Playgroud)
但它给了我错误: Variable $name of type "String" used in position expecting type "String!"
如果我改变我的突变mutation M($name: String = "default")它按预期工作.这看起来与类型系统有关,但我似乎无法弄清楚问题是什么.
假设我要制作一个如下所示的自定义输入元素:
struct CustomInput : View {
@Binding var text: String
var name: String
var body: some View {
TextField(name, text: $text)
.modifier(InputModifier())
}
}
Run Code Online (Sandbox Code Playgroud)
当前,当我实例化该视图时,需要将text和name名称都传递给参数。我希望能够使name参数成为可选参数,例如下面的示例。
CustomInput("Some name", $text)
Run Code Online (Sandbox Code Playgroud)
通常,我会为此使用init方法。但是我不确定如何像@Bindinginit函数一样处理属性包装器。
关于如何实现此目标的任何想法?
我正在尝试在我的Meteor应用程序中实现基本的拖放功能.我希望用户能够将文件(从他们的文件系统)删除到指定的dom元素中,并在dataTransfer对象中检索该文件.不幸的是,我似乎无法阻止事件在drop事件上重新加载整个页面.这是我的基本事件处理程序:
Template.sideBar.events({
'drop #features' : function(e, t) {
e.preventDefault();
var fileList = e.dataTransfer.files;
console.log(fileList[0]);
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
我用Chrome和Firefox测试了这个.我错过了什么吗?有没有人成功实现过这个?
为初学者问题道歉.
关于将RESTful服务与不同用户结合使用的一般方法,我有点困惑.特别是,我主要关注的是开发一个API,我只会通过我编写的各种应用程序,即Web应用程序,以及可能会访问相同数据的一些移动应用程序.
(1)由django-tastypie之类的东西产生的休息API是否适合非公开使用(即,当我只想通过我的应用程序授予对这些数据的访问权限时)?
(2)在创建Restful API的登录访问权限时,我是否为我的网络应用程序的所有用户创建了一个登录名 - 或者我是否为自己和我的Web应用程序创建了一个登录名?我的webapp用户帐户是否应被视为与访问Restful API的帐户不同?
基本上,我想使用Django和django-tastypie创建一个应用程序,它允许用户登录,创建和查看对象,订阅用户并查看他们的对象.我想将Tastypie API用于我自己的javascript目的,以便在我的视图中创建序列化和更新相关数据.这些用户帐户在哪里适合这张图片?谢谢!
在我的最新代码中,我focus在textarea上有一个事件处理程序.当用户单击textarea时,将触发该事件处理程序,该处理程序根据所选的textarea设置一些其他DOM状态.但是,在我的程序的其他地方,我想以编程方式设置focustextarea而不触发该事件处理程序.我知道Backbone有一种silently执行动作的方法.
我唯一的伪解决方案是暂时设置一个变量:
var silence = true;
Run Code Online (Sandbox Code Playgroud)
然后,在我的事件处理程序中,只有在静默为假时才执行逻辑.处理程序仍然被触发,但逻辑不会运行.
还有其他人知道更好的策略吗?
来自 React 背景,如果定义了值,则很容易仅呈现视图。它看起来像这样:
function Component ({ profile }) {
return (
<div>{profile && <div>{profile.name}}</div>
)
}
Run Code Online (Sandbox Code Playgroud)
但我发现在 SwiftUI 中复制这种模式要困难得多。理想情况下,我们可以在我们的视图中使用条件展开,但这目前不起作用。我能想出的唯一解决方案真的很不优雅:
function Component ({ profile }) {
return (
<div>{profile && <div>{profile.name}}</div>
)
}
Run Code Online (Sandbox Code Playgroud)
有没有人有一些更好的策略来使用可选值进行条件渲染?