所以我试图为学校的项目制作一个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
});
}
});
}
对于我做错了什么的任何解释都将不胜感激。
答案 0 :(得分:2)
唯一的问题是您的“click .found”处理程序,因为event.target
是按钮,它没有price
或text
属性。
将其更改为:
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)
确保正确发布和订阅此收藏集。