Javascript 如何知道使用Meteor.JS(在模板内)在MongoDB集合中插入是否成功 形势

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

让我们将此问题分解为一个简单的待办事项列表,其中的条目列在\li中:

//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>