Ember.js 升级到余烬/余烬数据2.0时出现问题

Ember.js 升级到余烬/余烬数据2.0时出现问题,ember.js,ember-data,ember-cli,Ember.js,Ember Data,Ember Cli,我有一个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

我有一个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数据
ember django适配器
的行为

这是我的(部分)
包。json

{
  "name": "my-app",
  "private": true,
  "devDependencies": {
    "ember-cli": "1.13.13",
    "ember-data": "1.13.15",
    "ember-django-adapter": "^1.1.1",
  }
}
{
  "name": "my-app",
  "dependencies": {
    "ember": "1.13.11",
    "ember-data": "1.13.15",
    "ember-resolver": "~0.1.20",
  }
}
下面是我的一些
bower.json

{
  "name": "my-app",
  "private": true,
  "devDependencies": {
    "ember-cli": "1.13.13",
    "ember-data": "1.13.15",
    "ember-django-adapter": "^1.1.1",
  }
}
{
  "name": "my-app",
  "dependencies": {
    "ember": "1.13.11",
    "ember-data": "1.13.15",
    "ember-resolver": "~0.1.20",
  }
}
所以,读了一点之后,我想也许我可以忽略这个警告,也许
的行为应该重新加载所有的
对我的应用程序来说并不那么重要

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

  • 将余烬和余烬数据更改为
    “~2.0.0”
    ,无论它们出现在
    package.json
    ember.json
  • npm卸载余烬数据
  • bower卸载余烬数据
  • bower卸载ember
  • npm缓存清除
  • bower缓存清除
  • npm安装
  • bower安装
  • 在这一点上,它告诉我我已经安装了
    ember-data@2.0.1
    ember@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
    

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

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

    import DRFAdapter from './drf';
    
    export default DRFAdapter.extend({
        shouldReloadAll() {
            return true;
        }
    });
    
    编辑:
    替换
    错误

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

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


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

    可能重复您是否只是尝试按照它所说的做?只需覆盖应用程序适配器中的
    shouldReloadAll()
    方法(它将扩展Django适配器),并使其返回true即可。更改的原因是缓存结果,并且可以使用
    this.store.findAll('foo',{reload:true})
    @uberclops显式地重新加载结果。我想我不知道该怎么做。我认为我没有应用程序适配器。你能给我解释一下我将如何重写该方法吗?@uberclops我现在已经尝试显式重新加载,但仍然得到相同的错误。这看起来可能很有用。你能告诉我你是怎么学会这个的吗?像
    drf adapter
    这样的细节是我猜不到的,所以我要么缺少约定,要么缺少文档中的正确位置。@EricWilson这是正确的答案,如果您真的希望shouldReloadAll返回true(我的项目中没有)。shouldReloadAll是一个Ember数据指令,如果存储中已经有记录,它会通知ED是否应该对API进行后续调用。默认情况下,shouldReloadAll用于返回true(每个store.findAll请求的API命中)。从2.0开始,默认情况下它返回false(在第一个store.findAll请求上命中一个API,然后依赖于存储缓存前进)——因此被称为“弃用”@dustinfarris我认为这是一个不赞成的想法,但它仍然让我困惑,为什么它会产生一个错误。是否依赖缓存不应产生与
    str.replace
    相关的错误,与
    normalizeModelName
    是否应该?在某些情况下,我认为最糟糕的结果是过时的,对吧?@dustinfarris没有修复实际的错误。我想我需要弄清楚如何从API返回
    'first-name'
    ,而不是
    'first\u-name'
    (例如)。但这有点像猜测&我不确定这样做的正确方法。@EricWilson如果您查看
    ember django adapter
    的文档,您将找到生成应用程序适配器的命令。请记住,在使用Ember数据时,
    应用程序
    适配器和序列化程序将按约定应用于所有模型,除非您为给定模型提供特定实现。对于属性命名,Ember提供了大量挂钩(例如
    keyForAttribute
    )来更改用于序列化的命名约定(请查看Ember Data RESTSerializer API文档)。