![](/img/trans.png)
[英]Ember.js - Model todo not found when using ember-cli-mirage for a fake model
[英]Ember destroyRecord (or deleteRecord then save) using ember-cli-mirage failing
我正在嘗試將ember-cli-mirage集成到此待辦事項應用程序https://github.com/ember-cli/ember-cli-todos中 。 此應用使用Ember 2.0或更高版本。 設置:
我驗證了該應用程序是否按廣告進行工作(除了此處不相關的一件小事)。 我可以創建,更新和刪除待辦事項。 待辦事項應用程序使用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”為待辦事項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,您嘗試用未定義的值對其進行更新。 之所以可能發生這種情況,是因為您的服務器返回的數據是為了響應與您發送的ID不同的ID的查找或更新。
我看到一條錯誤消息,上面有類似“ normalizeserializer ...”的文字,但我忘記了復制整個消息。
我添加了一個適配器:
shell> ember g adapter application
// app/adapters/application.js
import DS from 'ember-data';
export default DS.JSONAPIAdapter.extend({
});
但這並沒有解決。
BTW,待辦事項創建,也調用保存在待辦事項上,可以正常工作。 該代碼位於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();
}
您的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
所有內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.