Ember从商店/海市蜃楼获取过滤数据

时间:2017-12-05 12:30:06

标签: javascript ember.js ember-data ember-cli-mirage

我正在尝试使用ember为智能家居设备构建应用。我已经安装了海市蜃楼,并声明了一个名为data的数组。它拥有家庭,用户和设备等阵列。现在我不知道从商店获取过滤数据,我真的很困惑商店的行为。出于这个原因,我已经阅读了一些相同的主题,例如Filtering store data in ember,但这在我的情况下不起作用。

实际上这是我的router.js

Router.map(function() {
  this.route('about');
  this.route('users', function() {
  });
  this.route('households', function() {
    this.route('index', { path: '/:user_id' })
    this.route('rooms',{ path: '/:household_id' });
    this.route('devices');
  });
});

如果我要去households.index,我想看到所有在他的成员数组中拥有user-id的家庭。以下代码剪辑显示了我的数据结构示例。

  "users": [
      {
          "id":101,
          "forename":"Peter",
          "surname":"Peterson",
          "memberIn":[
              501
          ]
      },
      {
          "id":102,
          "forename":"Anna",
          "surname":"Peterson",
          "memberIn":[
              501
          ]
      }
]

  "households":[
      {
          "id":501,
          "name":"Zuhause",
          "admin":131000,
          "member":[
              101,
              102
          ]
}

我正在调用此类{{#link-to“households.index”user.id}}这样的路线来处理home.index,而我在household.index中的路线看起来像这样

model(params) {
    //holt alle Haushalte und gibt dann nur die Haushalte weiter, die auch den aktuellen Benutzer als Member haben.
   return this.get('store').findAll('household').then(results => results.filter((site) => {
       return site.get('member').filter(x => x == params.user_id).length > 0;
   }));
  } 

我的config.js在海市蜃楼就像这样:

  this.get('/households', function(db, request) {
    return { households: data.households };   
});

这很好用! 但在我看来,服务器负责向我提供我要求的数据。所以我想要的是我发送一个特定的请求,然后获得我需要的家庭。

我的尝试: index.js:

export default Route.extend({
    model(params) {
        return this.get('store').find('household', params.user_id);
      }
});

config js part:

  this.get('/households/:id', function(db, request) {
      console.log('household get');
      console.log(data.households.filter(x => x.member.filter(x => x == request.params.id).length > 0));
    return  { households: data.households.filter(x => x.member.filter(x => x == request.params.id).length > 0) };   
});

调试错误:

  

处理路径时出错:households.index payload.data为null

我无法理解为什么会出现这种错误。日志给了我想要返回的数组。

2 个答案:

答案 0 :(得分:0)

默认情况下,Ember Data附带JSONAPISerializer,这假设您的服务器(在本例中为海市蜃楼)格式化数据的方式。在这种情况下,海市蜃楼返回的文档通常符合JSON API Spec并且有一个顶级成员data,其中包含响应的主要数据。

如果您希望坚持自定义格式化的回复,可能需要查看Ember数据的JSONSerializer。否则,返回以下内容应该让你更接近:

return  { data: db.households.filter(x => x.member.filter(x => x == request.params.id).length > 0) };

或者您可以利用Mirage

附带的JSONAPISerializer

在此处查看更多Ember Guides | Serializers

答案 1 :(得分:0)

确保您在海市蜃楼中使用RestSerializer,

// mirage/serializers/application.js
import { RestSerializer } from 'ember-cli-mirage';

export default RestSerializer;

如果格式正确,请参阅RESTAdapterAPI

确保以下列格式返回数据

单一回复,

{
  "posts": {
    "id": 1,
    "title": "I'm Running to Reform the W3C's Tag",
    "author": "Yehuda Katz"
  }
}

并且不止一个,

{
  "posts": [
    {
      "id": 1,
      "title": "I'm Running to Reform the W3C's Tag",
      "author": "Yehuda Katz"
    },
    {
      "id": 2,
      "title": "Rails is omakase",
      "author": "D2H"
    }
  ]
}