我很难理解如何在使用EmberFire和Firebase的Ember.js中更新记录。
我构建了一个小的测试应用程序,试图理解CRUD的所有功能。我可以返回已创建的任务列表、创建新任务和删除任务。但我无法正确更新列表中的记录。
当我在我的索引页上查看检查器时,我看到在Ember调试器的Data下,它显示了我的模型,并且有一个Id字段,它包含Firebase在服务器上创建记录时生成的值。
但是,当我控制台记录路由中传递给更新操作的对象时,没有Id属性。我想这就是为什么我得到一个错误:
Error: no record was found at https://taskline.firebaseio.com/tasks/id
当点击这段代码时:
export default Ember.Route.extend({
model: function () {
return this.store.findAll('task');
},
actions: {
updateTask: function (model) {
console.log(JSON.parse(JSON.stringify(model)));
this.store.findRecord('task', 'id').then(function(task){
task.set( 'taskname', model.taskname);
task.set( 'startdate', model.startdate);
task.set( 'enddate', model.enddate);
task.set( 'banding', model.banding);
return task.save();
});
},
Ember Fire应该处理Id,不是吗?但是,如果它不在我的模型对象中,我应该如何将它传递给find查询?
当您想要更新模型时,将记录从模板/控制器传递回路由操作的最佳选项之一。在这种情况下,记录将在您的函数参数中准备好,因此您的updateTask方法看起来像这样(仅):
updateTask(record) {
record.save();
}
整个过程:
首先,在路由处理程序中下载所有记录,就像您在示例中所做的那样,并实现操作:
import Ember from 'ember';
export default Ember.Route.extend({
model() {
this.store.findAll('task');
},
actions: {
updateTask(task) {
task.save();
}
},
});
其次,在您的模板中,用输入框列出每个任务。也许是一张桌子。(我这里只有一个字段taskname
,但你当然可以有更多。)
<table>
<thead>
<th>ID</th>
<th>Taskname</th>
<th>Action</th>
</thead>
<tbody>
{{#each model as |task|}}
<tr>
<td>{{task.id}}</td>
<td>{{input value=task.taskname}}</td>
<td><button {{action 'updateTask' task}}>Update</button>
</tr>
{{/each}}
</tbody>
</table>
如您所见,您正在将task
记录发送回路由中的updateTask
操作,因此我们可以立即保存它。你可以在这个免费教程中学习所有这些技巧,它专注于Ember Way并使用Firebase:http://yoember.com