【问题标题】:Trouble upgrading to Ember/Ember-Data 2.0升级到 Ember/Ember-Data 2.0 时遇到问题
【发布时间】:2016-01-07 03:28:33
【问题描述】:

我有一个 ember-cli 项目,我正在尝试使用 ember 2.0。我知道这个想法是在升级之前删除所有弃用警告,但我不知道如何处理这个:

DEPRECATION: The default behavior of shouldReloadAll will change in Ember Data 2.0 
to always return false when there is at least one "foo" record in the store. 
If you would like to preserve the current behavior please override shouldReloadAll 
in your adapter:application and return true. 
[deprecation id: ds.adapter.should-reload-all-default-behavior]

例如,此警告与我为this.store.findAll('foo') 拨打的电话有关。

据我所知,解决此问题将涉及更改 ember-dataember-django-adapter 的行为。

这是我的(部分)package.json

{
  "name": "my-app",
  "private": true,
  "devDependencies": {
    "ember-cli": "1.13.13",
    "ember-data": "1.13.15",
    "ember-django-adapter": "^1.1.1",
  }
}

这是我的一些bower.json

{
  "name": "my-app",
  "dependencies": {
    "ember": "1.13.11",
    "ember-data": "1.13.15",
    "ember-resolver": "~0.1.20",
  }
}

所以,读了一点之后,我想也许我可以忽略这个警告,也许shouldReloadAll 的行为对我的应用来说并不是那么重要。

我会仔细列出我的步骤,因为我对 npm 或 bower 不是很熟悉,而且我可能做错了什么。

  1. 将 ember 和 ember-data 更改为 "~2.0.0",无论它们出现在 package.jsonember.json
  2. npm uninstall ember-data
  3. bower uninstall ember-data
  4. bower uninstall ember
  5. npm cache clear
  6. bower cache clear
  7. npm install
  8. bower install

此时它告诉我已经安装了ember-data@2.0.1ember@2.0.2

然后我运行应用程序,发现如下错误:

TypeError: str.replace is not a function
    at Object.func (ember.debug.js:35278)
    at Object.Cache.get (ember.debug.js:12867)
    at decamelize (ember.debug.js:35320)
    at Object.func (ember.debug.js:35235)
    at Object.Cache.get (ember.debug.js:12867)
    at Object.dasherize (ember.debug.js:35324)
    at ember$data$lib$system$normalize$model$name$$normalizeModelName (normalize-model-name.js:13)
    at ember$data$lib$serializers$json$serializer$$default.extend.modelNameFromPayloadKey (rest-serializer.js:426)
    at ember$data$lib$serializers$json$serializer$$default.extend._normalizePolymorphicRecord (rest-serializer.js:161)
    at rest-serializer.js:141onerrorDefault @ ember.debug.js:29661exports.default.trigger @ ember.debug.js:51067(anonymous function) @ ember.debug.js:52059Queue.invoke @ ember.debug.js:978Queue.flush @ ember.debug.js:1042DeferredActionQueues.flush @ ember.debug.js:838Backburner.end @ ember.debug.js:166Backburner.run @ ember.debug.js:288run @ ember.debug.js:19125hash.success @ rest-adapter.js:735fire @ jquery.js:3148self.fireWith @ jquery.js:3260done @ jquery.js:9314callback @ jquery.js:9718

报告了以下版本:

DEBUG: -------------------------------
vendor.js:15777 DEBUG: Ember      : 2.0.2
vendor.js:15777 DEBUG: Ember Data : 2.0.1
vendor.js:15777 DEBUG: jQuery     : 1.11.3
vendor.js:15777 DEBUG: -------------------------------
vendor.js:19380 Rendering application with bracketfun-web@view:toplevel: Object

请注意:在我收到的对弃用的任何解释中,此错误似乎与弃用无关。

【问题讨论】:

  • 您是否尝试按照它所说的去做?只需覆盖应用程序适配器中的 shouldReloadAll() 方法(这将扩展 Django 适配器)并使其返回 true。更改的原因是结果被缓存,并且可以使用this.store.findAll('foo', { reload: true }) 显式重新加载。
  • @uberclops 我想我不明白该怎么做。我认为我没有应用程序适配器。您能否向我解释一下我将如何覆盖该方法?
  • @uberclops 我现在已经尝试显式重新加载,但仍然得到同样的错误。

标签: ember.js ember-data ember-cli


【解决方案1】:

您需要在命令行中使用ember generate drf-adapter application 创建您的应用程序适配器。这将创建文件app/adapters/application.js,您将在其中添加shouldReloadAll() 的覆盖,最终结果应如下所示:

import DRFAdapter from './drf';

export default DRFAdapter.extend({
    shouldReloadAll() {
        return true;
    }
});

编辑: replace 错误。

如果您查看堆栈跟踪并查看错误的来源,您会发现它源自序列化程序。它正在努力从有效负载中获取模型名称。这很可能是因为您尚未设置应用程序序列化程序。

您可以使用ember generate drf-serializer application 生成序列化程序。这将创建文件app/serializers/application.js

请记住,Ember 不知道通过简单地安装插件来隐式使用适配器/序列化程序,您需要通过创建应用程序适配器和序列化程序来告诉它使用它们。

【讨论】:

  • 这看起来很有用。你能告诉我你是怎么学会这个的吗? drf-adapter 之类的细节是我无法猜到的,所以我要么缺少约定,要么缺少文档中的正确位置。
  • @EricWilson 这是正确的答案,如果您真的希望 shouldReloadAll 返回 true(我的项目中没有)。 shouldReloadAll 是一个 Ember Data 指令,如果存储中已有记录,它会通知 ED 是否应该对您的 API 进行后续调用。 shouldReloadAll 用于默认返回 true(每个 store.findAll 请求的 API 命中)。从 2.0 开始,它默认返回 false(第一个 store.findAll 请求上的单个 API 命中,然后依赖于存储缓存向前)——因此是“弃用”。 emberjs.com/api/data/classes/…
  • @dustinfarris 我认为这是弃用的想法,但它仍然让我困惑为什么它会产生错误。是否依赖缓存不应该产生与str.replace 相关的与normalizeModelName 相关的错误?在某些情况下,我应该预料到的最糟糕的结果会是过时的结果,对吧?
  • @dustinfarris 没有修复实际错误。我想我需要弄清楚如何从我的 API 返回 'first-name' 而不是 'first_name' (例如)。但这有点像猜测,我不确定这样做的正确方法。
  • @EricWilson 如果您查看ember-django-adapter 的文档,您会发现生成应用程序适配器的命令。请记住,在使用 Ember Data 时,application 适配器和序列化程序将按惯例应用于所有模型,除非您为给定模型提供特定实现。至于属性命名,Ember 提供了大量的钩子(例如keyForAttribute)来更改用于序列化的命名约定(请查看 Ember Data RESTSerializer API 文档)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多