2014-08-27 3 views
5

Я пытаюсь создать приложение, используя ember.js и Ember-данные, используя следующие версии:Ошибка при обработке ошибки маршрута в ember.js с Ember-данными

DEBUG: Ember  : 1.7.0 
DEBUG: Ember Data : 1.0.0-beta.9 
DEBUG: Handlebars : 1.2.1 
DEBUG: jQuery  : 2.1.0 

Я использую RESTAdapter для подключения к api, который я написал с помощью node.js.

Как только я загрузить приложение я получаю следующее сообщение об ошибке:

Error while processing route: students undefined is not a function TypeError: undefined is not a function 
    at http://localhost:9000/scripts/vendor/ember-data.js:12006:34 
    at tryCatch (http://localhost:9000/scripts/vendor/ember.js:45818:16) 
    at invokeCallback (http://localhost:9000/scripts/vendor/ember.js:45830:17) 
    at publish (http://localhost:9000/scripts/vendor/ember.js:45801:11) 
    at http://localhost:9000/scripts/vendor/ember.js:29069:9 
    at DeferredActionQueues.invoke (http://localhost:9000/scripts/vendor/ember.js:634:18) 
    at Object.DeferredActionQueues.flush (http://localhost:9000/scripts/vendor/ember.js:684:15) 
    at Object.Backburner.end (http://localhost:9000/scripts/vendor/ember.js:147:27) 
    at Object.Backburner.run (http://localhost:9000/scripts/vendor/ember.js:202:20) 
at apply (http://localhost:9000/scripts/vendor/ember.js:18382:27) 

Вот код, я использую (загружается в том же порядке, я вставил его):

приложение. JS

var App = window.App = Ember.Application.create({ 
    LOG_ACTIVE_GENERATION: true, 
    LOG_TRANSITIONS: true, 
    LOG_TRANSITIONS_INTERNAL: false, 
    LOG_VIEW_LOOKUPS: true 
}); 

store.js

App.ApplicationAdapter = DS.RESTAdapter.extend({ 
    host: 'http://localhost:3000', 

    serializer: DS.RESTSerializer.extend({ 
     primaryKey: function(type) { 
      return '_id'; 
     }, 

     serializeId: function(id) { 
      return id.toString(); 
     } 
    }) 
}); 

модели/student.js

App.Student = DS.Model.extend({ 
    firstName: DS.attr('string'), 
    lastName: DS.attr('string'), 
    nationality: DS.attr('string'), 
    createdAt: DS.attr('date') 
}); 

маршруты/app_route.js

App.StudentsRoute = Ember.Route.extend({ 
    model: function() { 
     return this.store.find('student'); 
    } 
}); 

router.js

App.Router.map(function() { 
    this.resource('students', {path: '/'}); 
}); 

И следующее отклик API:

{ 
    students: [ 
     { 
      nationality: "Lorem", 
      lastName: "Doe", 
      firstName: "John", 
      _id: "53f87200f3750319b4791235", 
      createdAt: "2014-08-23T10:50:40.661Z" 
     }, 
     { 
      nationality: "Lorem", 
      lastName: "Doe", 
      firstName: "John", 
      _id: "53f87299f3750319b4791234", 
      createdAt: "2014-08-23T10:50:40.661Z" 
     } 
    ] 
} 

Похоже, что магазин не загружается данных из API, но формат JSON данных выглядит нормально. Любая идея, что может быть неправильным?

Спасибо!

+0

Я думаю, что у меня была точно такая же ошибка, которая началась, когда я не использую 1.7.0 но 1.8.0 -бета1 ... переход на 1.7.0 исправил его для меня. Не знаю, почему у вас проблема :( – Leeft

+0

Я считаю, что вам нужно использовать строку в 'primaryKey' вместо функции [на основе документов] (http://emberjs.com/api/data/classes/DS .RESTSerializer.html # property_primaryKey). Что-то вроде 'primaryKey: ''. –

ответ

3

Таким образом, после поиска более на переполнение стека, я понял, что сериализатору теперь должен быть в отдельном классе, чем RESTAdapter, поэтому рабочий код выглядит следующим образом:

store.js

App.ApplicationAdapter = DS.RESTAdapter.extend({ 
    host: 'http://localhost:3000' 
}); 

App.ApplicationSerializer = DS.RESTSerializer.extend({ 
    primaryKey: '_id', 
    serializeId: function(id) { 
     return id.toString(); 
    } 
}); 
+0

Для тех, кто использует 'ember-cli', проверьте мой ответ. –

0

Я получал эту ошибку, и это не имело никакого отношения к какому-либо из обычных подозреваемых.

В coffeescript я начал определять модель.

App.Cost = DS.Model.extend 
    amount:   DS.attr 'number' 
    active:   DS.attr 'boolean' 

Чтобы создать вторую модель, я с/п моя первая модель и удалены атрибуты:

App.Cost = DS.Model.extend 

вернулся и попытался бежать, казалось бы, не связанную модель

localhost:3000/products 

Который привел к ошибке

Error while processing route: products.index 

Просто убедившись, что моя модель была названа правильно решена ошибка:

App.Cost = DS.Model.extend(...) 
App.Price = DS.Model.extend(...) <- instead of repeating the Cost model 

Это было повторно продюсированная, так что я подумал, что это может быть полезным для других.

2

Вот обновленный ответ для людей, использующих ember-cli.

ember g adapter application #=> creates app/adapters/application.js 
ember g serializer application #=> creates app/serializers/application.js 

В app/adapters/application.js:

import DS from 'ember-data'; 

export default DS.RestAdapter.extend({ 
    host: 'http://localhost:3000' 
}); 

В app/serializers/application.js:

import DS from 'ember-data'; 

export default DS.RESTSerializer.extend({ 
    primaryKey: '_id', 
    serializeId: function(id) { 
    return id.toString(); 
    } 
}); 
Смежные вопросы