2

我想做的是将 ember-cli-mirage 集成到这个 todo 应用程序中,https://github.com/ember-cli/ember-cli-todos。此应用程序使用 Ember 2.0 或更高版本。设置:

  1. 克隆待办事项应用程序,然后 cd 进入应用程序目录。
  2. 外壳> npm安装
  3. 外壳>凉亭安装
  4. 外壳>余烬服务

我验证了该应用程序的工作方式与宣传的一样(除了与此处无关的一件小事)。我可以创建、更新和删除待办事项。待办事项应用程序使用 ember-data-fixture-adapter/FIXTURES 为应用程序提供数据。

我集成 ember-cli-mirage 的步骤是:

  1. 注释掉 app/models/todo.js 中的 Todo.reopenClass 块(创建 FIXTURES/seed 数据的代码)。
  2. 删除了 app/adapters 目录(仅包含一个文件 application.js(仅包含一行“export { default } from 'ember-data-fixture-adapter';”))。我相当确定这整个目录仅对 FIXTURES 设置有用。
  3. 外壳> ember 安装 ember-cli-mirage
  4. 按照此处的说明设置 ember-cli-mirage 部件 (app/mirage/{config.js,factories/post.js,scenarios/default.js}) http://www.ember-cli-mirage.com/docs/ 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();” 上面的线。当我删除一个待办事项时,删除仍然失败,但在控制台上,在“成功请求:删除 /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({
});

但这并没有解决问题。

顺便说一句,创建待办事项,也可以在待办事项上调用保存,可以正常工作。代码位于 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();
}
4

1 回答 1

4

你的 Mirage 模拟DELETE/todos/:id什么样子?看起来您正在使用包含 的 JSON 有效负载响应 DELETE 请求id,这会导致问题。

相反,您可以尝试返回空响应正文的内容,例如

this.del('/todos/:id', (db, request) => {
  let id = request.params.id;
  db.todos.remove(id);

  return new Mirage.Response(204, {}, {});
});

(此代码未经测试,但希望您能理解)。

另一个小点,有一个模型上的方法,destroyRecord它基本上是一次性的。deleteRecordsave

于 2015-10-17T13:45:33.263 回答