3:表单和事件
所有应用程序都需要允许用户对存储的数据执行某种类型的交互。在我们的例子中,第一种交互类型是插入新的任务。如果没有它,我们的待办事项应用程序将不会很有用。
用户在网站上插入或编辑数据的主要方式之一是通过表单。在大多数情况下,使用<form>
标签是一个好主意,因为它为其中的元素赋予了语义含义。
3.1:创建任务表单
首先,我们需要创建一个简单的表单组件来封装我们的逻辑。
在App.html
文件中创建一个名为form
的新模板,并在新模板中,我们将添加一个输入字段和一个按钮
imports/ui/App.html
...
<template name="form">
<form class="task-form">
<input type="text" name="text" placeholder="Type to add new tasks" />
<button type="submit">Add Task</button>
</form>
</template>
3.2:更新mainContainer模板元素
然后我们可以简单地将它添加到我们上面任务列表的mainContainer
模板中
imports/ui/App.html
...
<template name="mainContainer">
<div class="container">
<header>
<h1>Todo List</h1>
</header>
{{> form }}
<ul>
{{#each tasks}}
{{> task}}
{{/each}}
</ul>
</div>
</template>
...
我们正在渲染我们在上一步中创建的form
模板,并且我们正在迭代每个任务并使用task
模板渲染它们。
3.3:更新样式表
您也可以根据需要对其进行样式设置。目前,我们只需要顶部的一些边距,这样表单看起来就不会偏离目标。将CSS类.task-form
添加到您的main.css
文件中。相同的名称必须在form
组件中的className
属性中使用。
client/main.css
.task-form {
margin-top: 1rem;
}
3.4:添加提交监听器
现在我们需要在表单的submit
事件上添加一个监听器
imports/ui/App.js
...
tasks() {
return TasksCollection.find({}, { sort: { createdAt: -1 } });
},
});
Template.form.events({
"submit .task-form"(event) {
// Prevent default browser form submit
event.preventDefault();
// Get value from form element
const target = event.target;
const text = target.text.value;
// Insert a task into the collection
TasksCollection.insert({
text,
createdAt: new Date(), // current time
});
// Clear form
target.text.value = '';
}
})
此外,在您的task
文档中插入一个名为createdAt
的日期属性,以便知道我们何时创建每个任务。
将事件附加到模板
事件监听器以与助手几乎相同的方式添加到模板中:通过使用字典调用Template.templateName.events(...)
。键描述要监听的事件,值是在事件发生时调用的事件处理程序。
在上面的例子中,我们监听与CSS选择器.task-form
匹配的任何元素上的submit
事件。当用户在输入字段或提交按钮内按下回车键触发此事件时,我们的事件处理程序函数将被调用。
事件处理程序获取一个名为event
的参数,该参数包含有关触发事件的一些信息。在这种情况下,event.target
是我们的表单元素,我们可以使用event.target.text.value
获取输入的值。您可以通过添加console.log(event)
并在浏览器控制台中检查对象来查看事件对象的所有其他属性。
最后,在事件处理程序的最后一行,我们需要清除输入以准备另一个新任务。
3.5:首先显示最新的任务
现在剩下的唯一更改是:我们需要首先显示最新的任务。我们可以通过对Mongo查询进行排序来快速完成此操作。
imports/ui/App.js
...
Template.mainContainer.helpers({
tasks() {
return TasksCollection.find({}, { sort: { createdAt: -1 } });
},
});
Template.form.events({
...
现在您的应用程序应该如下所示
回顾:您可以检查代码在这一步结束时应该是什么样子这里。
在下一步中,我们将更新您的任务状态并提供一种方法供用户删除任务。