find和findAll返回一个空数组

Dou*_*gui 2 ember.js ember-data

在一个ember 1.13.3应用程序中,我有这条路线:

import Ember from 'ember';

export default Ember.Route.extend({
  model: function() {
    return this.store.find('skill');
  }
});
Run Code Online (Sandbox Code Playgroud)

而这个型号:

import DS from 'ember-data';

export default DS.Model.extend({
  name: DS.attr('string'),
  description: DS.attr('string'),
  link: DS.attr('string'),
  acquired_skills: DS.hasMany('users', { async: true, inverse: 'acquired_skills' } ),
  searched_skills: DS.hasMany('users', { async: true, inverse: 'searched_skills' } )
});
Run Code Online (Sandbox Code Playgroud)

这是api返回的结果:

{"skills":[{"id":1,"name":"Ember","description":"JS Framework","link":null}]}
Run Code Online (Sandbox Code Playgroud)

数组是空的.我可以用它检查它,console.log(this.store.find('skill').get('length'));我有0.

怎么了?

And*_*aus 5

store.find()是一个异步操作.它返回一个承诺.要访问实际数据,您必须将回调传递给promise.当从后端获取数据时,promise会解析并执行回调,并将数据传递给它:

var foo = this.store.find('skill');

console.log("typeof foo", typeof foo);

foo.then( function(result) {
  console.log("result", result);
});

console.log("end of script");
Run Code Online (Sandbox Code Playgroud)

上面的代码将产生以下输出:

typeof foo,Promise
脚本
结果,Object

UPD 1

你正在使用JSONAPIAdapter.您显示的有效负载不符合JSON API规范.您应该更新后端以符合规范.

如果你不能,请使用RESTAdapterRESTSerializer作为解决方法:

应用程序/适配器/ application.js中

import DS from 'ember-data';

export default DS.RESTAdapter.extend({
  host: 'http://localhost:3000',
  namespace: 'api/v1'
});
Run Code Online (Sandbox Code Playgroud)

应用程序/串行器/的application.js

import DS from 'ember-data';

export default DS.RESTSerializer.extend({
  isNewSerializerAPI: false
});
Run Code Online (Sandbox Code Playgroud)

更多信息:http://emberjs.com/blog/2015/06/18/ember-data-1-13-released.html