繁体   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