Javascript 如何知道使用Meteor.JS(在模板内)在MongoDB集合中插入是否成功 形势
让我们将此问题分解为一个简单的待办事项列表,其中的条目列在\li中:Javascript 如何知道使用Meteor.JS(在模板内)在MongoDB集合中插入是否成功 形势,javascript,node.js,mongodb,meteor,Javascript,Node.js,Mongodb,Meteor,让我们将此问题分解为一个简单的待办事项列表,其中的条目列在\li中: //main.html <ul> {{ #each listEntries }} <li class="item"> {{ title }} </li> {{ /each }} </ul> 现在,我正在从客户端的控制台手动调用: TodoCollection.insert({title: 'My first entry'}); 到目前为止,一切都很好。 现在me
//main.html
<ul>
{{ #each listEntries }}
<li class="item">
{{ title }}
</li>
{{ /each }}
</ul>
现在,我正在从客户端的控制台手动调用:
TodoCollection.insert({title: 'My first entry'});
到目前为止,一切都很好。
现在meteor.JS异步工作,这意味着客户端中所做的更改也会立即影响DOM,而不知道数据库插入是否成功。如果没有,DOM元素将再次被删除(因此meteor首先插入新的
,然后如果插入失败,它将再次删除它)
你怎么能从meteor那里得到一些来自数据库的信息呢
我需要的是:
//main.html
{{{#每个列表}
-
{{title}}
{{{#如果是isInDatabase}
-我真的被储存了!
{{/if}
{{/每个}}
您可以使用集合的insert方法的回调。使用错误(null
如果没有)和存储在数据库中的对象Id调用回调
下面您可以看到用于测试此功能的代码:
html:
<head>
<title>simple</title>
</head>
<body>
<h1>Welcome to Meteor!</h1>
{{>test}}
</body>
<template name="test">
<ul>
{{#each item in list}}
<li>{{item.name}}</li>
{{/each}}
</ul>
{{#if insertResult}}
<div class="insert_result">{{insertResult}}</div>
{{/if}}
{{#if insertError}}
<div class="insert_error">{{insertError}}</div>
{{/if}}
<form>
<input type="text" name="name" />
<input type="submit" value="Add" />
</form>
</template>
import { Template } from 'meteor/templating';
import { ReactiveVar } from 'meteor/reactive-var';
collection = new Mongo.Collection('collection');
if (Meteor.isClient) {
Template.test.onCreated(function () {
this.insertResult = new ReactiveVar();
this.insertError = new ReactiveVar();
});
Template.test.helpers({
list() {
return collection.find();
},
insertResult() {
return Template.instance().insertResult.get();
},
});
Template.test.events({
'submit form'(event, instance) {
event.preventDefault();
collection.insert({
name: event.target.name.value
},function(err,result) {
if (err) {
instance.insertError.set(err);
instance.insertResult.set(null);
} else {
instance.insertResult.set(result);
instance.insertError.set(null);
}
});
},
});
}
正如您在前面的答案中所看到的,在Meteor中,要知道是什么导致了反应式更新是相当麻烦的
我建议采用另一种方法:不要在客户机上插入。对执行插入的服务器方法执行
Meteor.call()
,然后让客户端进行反应式更新。然后,您总是确保屏幕上看到的内容实际上在数据库中。我想我自己找到了最简单的解决方案:
在服务器端添加钩子,该钩子将使用obj.onCreated=new date()添加创建日期
有助于识别它来自服务器,因为客户端上不存在此代码
{{#each item}}
{{ #if item.onCreated }}
<li class="success-db">{{name}}</li>
{{ else }}
<li class="pending-db">{{name}}</li>
{{ /if }}
{{/each}}
{{{#每个项目}
{{#如果item.onCreated}
{{name}
{{else}
{{name}
{{/if}
{{/每个}}
(如果您发现这个答案与Meteor.JS的工作方式相矛盾,请不要犹豫,改进它)如果您想显示存在标题的数据,那么您可以这样编写代码
<ul>
{{ #each listEntries }}
<li class="item">
{{ title }}
{{ #if title }}
- i am actually stored!
{{ /if }}
</li>
{{ /each }}
</ul>
{{{#每个列表}
-
{{title}}
{{{#如果标题}
-我真的被储存了!
{{/if}
{{/每个}}
您可以在方法存根中进行插入,这样插入时会带有一个标志,表明数据是临时的。这对我来说不是一个合适的解决方案。让我解释一下:我想让meteor在客户机中添加DomeElement的“特别”功能。但是我想(出于用户体验的原因)向用户显示当前正在添加元素->空闲模式。您的解决方案会起作用,但会使事情变得不必要的复杂。感谢您提出的解决方案。在您的示例中,虽然它不是发生在相应的内部,而是发生在
外部。它显示了你可以用meteor做什么,但它并没有解决参考问题:我不知道meteor添加了哪个
(我可以使用类似于:last child的东西,但这不能确保这是我正在寻找的元素,因为它也可能是同时添加的另一个元素)。你读过这个问题了吗?您提出的解决方案将如何帮助解决这个问题?我希望您了解meteor的minimongo概念。因此,当您将客户端minmongo与服务器mongo数据库同步时。该函数还将在客户端mongo上插入一个可预测的结果,如果服务器当时允许操作,则客户端mongo将返回到旧状态。listEntries助手必须重新启动日期,如:TodoCollection.find();嗨,潘卡吉。很抱歉,你误解了我的问题。我完全理解这一概念,这是好的和可取的。但是我想通过显示静态地将条目插入数据库来增强用户体验,因为在某些情况下,这对于用户来说很重要(插入了关键数据,例如重要的邮件)。我知道当手术不成功时,它会恢复到原来的状态,但现在这真的没有帮助,但谢谢。
{{#each item}}
{{ #if item.onCreated }}
<li class="success-db">{{name}}</li>
{{ else }}
<li class="pending-db">{{name}}</li>
{{ /if }}
{{/each}}
<ul>
{{ #each listEntries }}
<li class="item">
{{ title }}
{{ #if title }}
- i am actually stored!
{{ /if }}
</li>
{{ /each }}
</ul>