我尝试做的是将ember-cli-mirage整合到这个待办事项应用https://github.com/ember-cli/ember-cli-todos中。此应用程序使用Ember 2.0或更高版本。设置:
我确认应用程序正在宣传(除了一个与此无关的小问题)。我可以创建,更新和删除待办事项。 todo应用程序使用ember-data-fixture-adapter / FIXTURES为应用程序提供数据。
我整合ember-cli-mirage的步骤是:
我发布app / mirage / {config.js,factories / post.js,scenarios / default.js}的代码,如果有人需要看到它,但它基本上只是一个副本ember-cli-mirage页面中的说明("用户"型号名称替换为"帖子")。
我重启了ember服务器。除了删除待办事项外,一切正常。通过按下" x"来完成记录删除。将指针移动到待办事项右侧时将出现的按钮。我发现它在删除记录的save()部分失败了。删除记录的代码(使用" x"按钮界面)位于app / components / todo-item / component.js中,它看起来像这样:
removeTodo() {
var todo = this.get('todo');
todo.deleteRecord();
todo.save();
}
当我尝试删除待办事项时,浏览器控制台会打印"成功请求:DELETE / todos / n" (" n"是todo id),然后它会打印出一个神秘的错误消息以及堆栈跟踪。
我评论了" todo.save();"上面的一行。当我删除了待办事项时,移除仍然失败,但在控制台上,在"成功请求之后不再出现错误消息:DELETE / todos / n"消息。
所以我更改了上面的removeTodo代码,试图让错误消息更加清晰。我改成了这个:
todo.save().then(function() {
console.log('Save OK.');
}).catch((err) => {
console.log('Save failed.');
console.log(err.message);
});
我已尝试对此处的各种更改,但始终出现的错误消息是:
断言失败:适配器无法为已具有id的记录分配新ID。有id:3,你试图用undefined更新它。这可能是因为您的服务器返回的数据是为了响应与您发送的ID不同的查找或更新。
我看到一条错误消息,其中包含" normalizeserializer ..."上面的文字,但我忘了复制整个信息。
我添加了一个适配器:
shell> ember g adapter application
// app/adapters/application.js
import DS from 'ember-data';
export default DS.JSONAPIAdapter.extend({
});
但这并没有解决它。
BTW,一个todo项目创建,也可以调用todo项目的保存,有效。代码位于app / components / todos-route / component.js:
createTodo() {
const store = this.get('store');
// Get the todo title set by the "New Todo" text field
var title = this.get('newTitle');
if (title && !title.trim()) {
this.set('newTitle', '');
return;
}
// Create the new Todo model
var todo = store.createRecord('todo', {
title: title
});
// Clear the "New Todo" text field
this.set('newTitle', '');
// Save the new model
todo.save();
}
答案 0 :(得分:4)
你的Mirage模仿DELETE
到/todos/:id
的样子是什么样的?看起来您正在使用包含id
的JSON有效内容来响应DELETE请求,这会导致问题。
相反,你可以尝试一些返回空响应体的东西,比如
this.del('/todos/:id', (db, request) => {
let id = request.params.id;
db.todos.remove(id);
return new Mirage.Response(204, {}, {});
});
(此代码未经测试,但希望您明白这一点。)
另一个小问题是,模型上有一个destroyRecord
方法,基本上可以同时执行deleteRecord
和save
。