Ember Data TypeError во время маршрутизации

Я получаю эту ошибку JS при попытке использовать маршрутизацию Ember:

Uncaught TypeError: Object <DS.Store:ember215> has no method 'create' ember-data-latest.js:3677
    Ember.onLoad.app.registerInjection.injection ember-data-latest.js:3677
    Ember.Application.Ember.Namespace.extend.initialize ember-latest.js:10381
    Ember.Application.Ember.Namespace.extend.initialize ember-latest.js:10380
    Ember.Application.Ember.Namespace.extend.initialize ember-latest.js:10379
    (anonymous function) app.js:6

Это последние версии Ember.js и Ember Data с GitHub сегодня (мастер-версия, а не релизные версии). Я знаю, что использование текущей версии выпуска может вызвать аналогичные проблемы, но пока это кажется необычным.

Оглядываясь назад на эти строки, кажется, что код маршрутизации Ember вызывает функцию данных Ember, и это вызывает ошибку (и препятствует правильной работе маршрутизации).

Есть ли какие-либо решения для этого еще?

jsFiddle: http://jsfiddle.net/bkjT4/2/

App = Ember.Application.create({});

App.Store = DS.Store.create({
  revision: 4,
  adapter: DS.RESTAdapter.create()
});

App.Router = Ember.Router.extend({
  root: Ember.State.extend({
    index: Ember.State.extend({
      route: '/'
    })
  })
});

App.router = App.Router.create({
    location: 'history' // does the same with hash
});

App.initialize(App.router);


person user1499207    schedule 03.07.2012    source источник
comment
Можете ли вы предоставить JSFiddle дополнительный код? Вы можете использовать это как отправную точку: jsfiddle.net/pangratz666/PjbpL   -  person pangratz    schedule 03.07.2012
comment
Готово — jsfiddle.net/bkjT4/2. Спасибо!   -  person user1499207    schedule 03.07.2012


Ответы (1)


Хорошо, проблема с has no method create() связана с тем, что вы назвали свой магазин App.Store (строка в верхнем регистре «Магазин»), и это экземпляр. Соглашение в Ember.js заключается в том, что вы называете классы UpperCase и экземпляры lowerCase (см. хороший пост в блоге от эмберист). Это проблема, потому что в ember-data зарегистрирована инъекция, которая автоматически создает экземпляр класса Store, если он определен, см. /ember-data/lib/system/application_ext.js#L9-11" rel="nofollow">здесь. Короче говоря: если вы измените его на App.store = Ember.Store.create({...}) или App.Store = Ember.Store.extend({...}), эта проблема будет решена.

После того, как это было решено, возникает другая проблема: вы используете Ember.State внутри вашего Ember.Router вместо этого вы должны использовать Ember.Route. Итоговый код выглядит так, см. http://jsfiddle.net/pangratz666/5Y2PX/:

App = Ember.Application.create({});

App.store = DS.Store.create({
  revision: 4,
  adapter: DS.RESTAdapter.create()
});

App.Router = Ember.Router.extend({
  root: Ember.Route.extend({
    index: Ember.Route.extend({
      route: '/'
    })
  })
});

App.router = App.Router.create({
    location: 'history'
});

App.initialize(App.router);

person pangratz    schedule 03.07.2012
comment
Спасибо! Этот сломанный код на самом деле был из генератора Rails, который, я думаю, не обновлялся. - person user1499207; 03.07.2012
comment
Хм, странно. Но, насколько я знаю, скоро все это будет исправлено. - person pangratz; 03.07.2012