2016-01-07 67 views
0

我有一個ember-cli項目,我正在嘗試使用ember 2.0。我知道這個想法是在升級前刪除所有棄用警告,但我不知道該怎麼做這一個:無法升級到Ember/Ember-Data 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. 變化餘燼和灰燼,數據"~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

在這一點上,告訴我,我已經安裝了[email protected][email protected]

我然後運行該應用程序,並發現以下錯誤:

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 [email protected]:toplevel: Object 

請注意:此錯誤與棄用似乎沒有關係,在我收到的任何棄用說明中都沒有提到。

+0

[DEPRECATION的可能重複:在Ember Data 2.0中,shouldReloadAll的默認行爲將在至少有一個時始終更改爲false(http://stackoverflow.com/questions/31016676/deprecation-the-default- behavior-of-shouldreloadall-will-change-in-ember-data-2) – nem035

+0

你剛剛做了什麼嗎?只需重寫應用程序適配器中的'shouldReloadAll()'方法(這將擴展Django適配器),並使其返回true。改變的原因是,結果被緩存,並且可以使用'this.store.findAll('foo',{reload:true})'顯式重載。 – uberclops

+0

@uberclops我想我不明白該怎麼做。我沒有想到我有一個_application adapter_。你能否向我解釋我將如何重寫該方法? –

回答

2

您需要通過從命令行使用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不知道通過簡單地安裝add來隱式使用適配器/序列化器,您需要通過創建應用程序適配器和序列化器來告訴它使用它們。

+0

這看起來很有用。你能告訴我你是如何學習的?像'drf-adapter'這樣的細節是我無法想象的,所以我要麼缺少一個約定,要麼就是在文檔中的正確位置。 –

+1

@EricWilson這是正確的答案,如果你真的想讓shouldReloadAll返回true(我不在我的項目中)。 shouldReloadAll是一個Ember Data指令,通知ED是否應該在商店中已經有記錄的情況下對API進行後續調用。 shouldReload全部用於默認返回true(每個store.findAll請求API命中)。從2.0開始,它默認返回false(第一個store.findAll請求中的單個API命中,然後依靠存儲緩存前進) - 然後是「棄用」。 http://emberjs.com/api/data/classes/DS.RESTAdapter.html#method_shouldReloadAll – dustinfarris

+0

@dustinfarris我認爲這是棄用的想法,但它仍然令我困惑,爲什麼它產生了一個錯誤。依賴於緩存或不應該不會產生一個關於與'normalizeModelName'相關的'str.replace'的錯誤?似乎最糟糕的是我應該預料會過時的結果,在某些情況下,對不對? –