Ember数据错误:model:@ each`,必须是`type:name形式

时间:2015-02-24 13:52:01

标签: ember.js ember-data

我有这个模型,当我使用此路由器和模型导航到此路由时会抛出错误。这是导致问题的寄存器。

注册路线模型:

export default DS.Model.extend({
  newUser: DS.belongsTo('user'),
  password: DS.attr('string')
});

我正在使用此模型的注册路由:

import Ember from 'ember';

export default Ember.Route.extend({
  model: function () {
    return this.store.find("account-type");
  }
});

这是我的路由器:

Router.map(function () {
  this.route('login');
  this.route('register');
  this.route('my-account');
  this.route('change-password');

  this.route('app', function () {
    this.resource('profile', {path: 'profile/profile_id'});
    this.route('connections');
    this.resource('conversation', {path: 'conversation/conversation_id'});
  });

  this.resource('myAccount', function() {});
  this.route('user');
});

用户模型:

export default DS.Model.extend({
  title: DS.attr('string'),
  firstName: DS.attr('string'),
  surname: DS.attr('string'),
  dateOfBirth: DS.attr('string'),
  telephoneNumber: DS.attr('string'),
  accountType: DS.belongsTo('accountType'),
  emailAddress: DS.attr('string'),

  //used to present full-name
  fullName: function () {
    return this.get('title') + ' ' +
      this.get('firstName') + ' ' +
      this.get('surname');
  }.property("title", "firstName", "surname")

});

我得到的错误:

model:@each`, must be of the form `type:name

这是我得到的堆栈跟踪:

Error while processing route: register Invalid fullName: `model:@each`, must be of the form `type:name`  TypeError: Invalid fullName: `model:@each`, must be of the form `type:name` 
    at __exports__.default.EmberObject.extend.resolve (http://localhost:4200/assets/vendor.js:16812:17)
    at Object.resolve [as resolver] (http://localhost:4200/assets/vendor.js:16434:25)
    at resolve (http://localhost:4200/assets/vendor.js:14970:32)
    at Object.Container.resolve (http://localhost:4200/assets/vendor.js:14550:16)
    at factoryFor (http://localhost:4200/assets/vendor.js:15053:31)
    at Object.Container.lookupFactory (http://localhost:4200/assets/vendor.js:14657:16)
    at Ember.Object.extend.modelFactoryFor (http://localhost:4200/assets/vendor.js:73164:31)
    at ember$data$lib$serializers$json_serializer$$default.extend.extractArray (http://localhost:4200/assets/vendor.js:67267:22)
    at apply (http://localhost:4200/assets/vendor.js:32891:27)
    at superWrapper (http://localhost:4200/assets/vendor.js:32459:15)

我想知道它是否与我的模拟有关?

apprev:

  accountTypesRouter.get('/', function (req, res) {
    res.send(
       ["foo", "boo"]

      /*
          [
       {"id": 1, "type": "foo"},
       {"id": 2, "type": "baa"}
       ]
      * */

    );
  });

1 个答案:

答案 0 :(得分:2)

您的API需要返回以某种方式格式化的JSON数据。 Ember想要一个用模型名称键入的对象。像这样:

{
    accountTypes: [{
        id: 1, 
        type: 'foo'
    },{
        id: 2, 
        type: 'boo'
    }]
}

如果您无法控制从API端点返回的内容,请编写DS.RESTSerializer以将JSON转换为Ember Data想要的内容。例如,如果您的服务器有效负载如下所示:

[{id:1, type:'foo'},{id:2, type:'boo'}]

您可以编写如下的序列化程序:

import DS from 'ember-data';
export default DS.RESTSerializer.extend( {
    extractArray: function(store, type, payload) {
        payload = {
            'accountTypes': payload
        };
        return this._super(store, type, payload);       
    },
});

正如@Kori指出的那样,DS.RESTAdapter docs简要讨论了Ember Data期望的JSON格式。