簡體   English   中英

使用ember-cli-mirage失敗的Ember destroyRecord(或deleteRecord然后保存)

[英]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或更高版本。 設置:

  1. 克隆待辦事項應用程序,然后CD進入應用程序目錄。
  2. shell> npm安裝
  3. 外殼>涼亭安裝
  4. shell>余燼發球

我驗證了該應用程序是否按廣告進行工作(除了此處不相關的一件小事)。 我可以創建,更新和刪除待辦事項。 待辦事項應用程序使用ember-data-fixture-adapter / FIXTURES為應用程序添加數據。

我整合ember-cli-mirage的步驟是:

  1. 在app / models / todo.js(創建FIXTURES / seed數據的代碼)中注釋掉Todo.reopenClass塊。
  2. 刪除了app / adapters目錄(僅包含一個文件application.js(僅包含一行,“從'ember-data-fixture-adapter'導出{default};“”))。 我可以肯定的是,整個目錄僅用於FIXTURES設置。
  3. shell> ember安裝ember-cli-mirage
  4. 按照http://www.ember-cli-mirage.com/docs/上的說明設置ember-cli-mirage部分(app / mirage / {config.js,factories / post.js,scenarios / default.js}) 。 v0.1.x / working-with-json-api /

如果有人需要查看,我將發布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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM