Meteor.js将项目从一个集合移动到另一个集合

时间:2015-11-26 00:04:28

标签: javascript mongodb meteor collections

所以我试图为学校的项目制作一个Grocery List应用程序。我想要的是让用户能够制作一个项目列表,然后当他们发现他们将它们移动到"找到的项目"列表,同时输入物品的销售价格。我有两个Mongo系列" Items"对于他们正在寻找的物品," Found_items"对于他们找到的人。我在将项目从Items移动到Found_items时遇到问题。他们确实从项目中删除了,但似乎没有被放入Found_items,或者至少他们没有出现在UI上。我非常确定当你点击"发现"按钮。我的代码如下......

project.html

<head>
  <title>Grocery List</title>
</head>

<body>
<div class="container">
  <header>
    <h1>Grocery List</h1>

    <form class="new-item">
      <input type="text" name="text" placeholder="Type to add new items" />
    </form>
  </header>

  <ul>
    {{#each items}}
      {{> item}}
    {{/each}}
  </ul>
</div>
<div class="container">
  <header>
    <h1>Items Found</h1>
  </header>

  <ul>
    {{#each found_items}}
      {{> found}}
    {{/each}}
  </ul>
</div>
</body>

<template name="item">
  <li>
    <button class="found">Got it!</button>

    <input type="number" name="price" placeholder="Sale Price" />

    <span class="text">{{text}}</span>
  </li>
</template>

<template name="found">
  <li>
    <span class="text">{{text}}</span>
  </li>
</template>

project.js

Items = new Mongo.Collection("items");
Found_items = new Mongo.Collection("found_items");

if (Meteor.isClient) {
  // This code only runs on the client
  Template.body.helpers({
    items: function () {
      return Items.find({});
    },
    found_items: function () {
      return Found_items.find({});
    }
  });


  Template.body.events({
    "submit .new-item": function (event) {
      event.preventDefault();

      var text = event.target.text.value;

      Items.insert({
        text: text
      });

      event.target.text.value = "";
    }
  });

  Template.item.events({
    "click .found": function (event) {
      Items.remove(this._id);

      event.preventDefault();

      var price = event.target.price.value;
      var text = event.target.text.value;

      Found_items.insert({
        text: text,
        price: price
      });

    }
  });
}

对于我做错了什么的任何解释都将不胜感激。

2 个答案:

答案 0 :(得分:2)

唯一的问题是您的“click .found”处理程序,因为event.target是按钮,它没有pricetext属性。

将其更改为:

Template.item.events({
  "click .found": function (event) {

      event.preventDefault();
      var price = Template.instance().find('[name="price"]').value;
      var text = Template.instance().find('.text').textContent;

      Items.remove(this._id);
      Found_items.insert({
        text: text,
        price: price
      });

事件处理程序还传递两个参数,即事件对象和定义处理程序的模板实例。所以你可以把它改成:

Template.item.events({
  "click .found": function (event, template) {
      event.preventDefault();
      var price = template.find('[name="price"]').value;
      var text = template.find('.text').textContent;

      ...

      });

由于this包含用于创建此(项目)模板的数据上下文,因此您可以进一步简化:

"click .found": function (event, template) {
  this.price = template.find('[name="price"]').value;
  Items.remove(this._id);
  Found_items.insert(this);
}

event.preventDefault()也已被删除,因为此目标上没有要阻止的默认操作(在您的其他事件中需要这是submit形式事件)。

答案 1 :(得分:0)

只需Found_items.insert(this)

确保正确发布和订阅此收藏集。