gpt4 book ai didi

javascript - DS.FixtureAdapter 丢失具有 hasMany 异步属性的夹具数据

转载 作者:行者123 更新时间:2023-11-29 21:58:44 24 4
gpt4 key购买 nike

背景

我已经提交了 github issue与 Ember Data 团队合作,但我很想深入了解如何解决这个问题(或者如果我一直都错了)

如果这个错误 on jsfiddle,您可以看到一个工作演示

问题

问题的 jsfiddle:http://jsfiddle.net/cdownie/JxhBv/1/为了更清楚的解释,这里复制了代码。

设置

我有以下数据模型,我想用固定装置进行测试:

App.Parent = DS.Model.extend({
name: DS.attr('name'),
kids: DS.hasMany('kids', {async : true})
});
App.Kid = DS.Model.extend({
name: DS.attr('name'),
grade: DS.attr('string')
});

我正在使用以下装置对其进行测试:

App.Parent.FIXTURES = [
{id: 'doe', name: 'john', links: {kids: '/fake/url/for/kids'}}
];
App.Kid.FIXTURES = [
{id: 'doe-jr', name: 'john jr', grade: '4th'}
];

现在,默认情况下 DS.FixtureAdapter 不支持这种关系,所以我不得不编写自己的扩展来填充 findHasMany 方法。在此实现中,我使用父 ID 作为所有子项的前缀。

App.CustomFixtureAdapter = DS.FixtureAdapter.extend({
defaultSerializer: '_umrest',

findHasMany: function(store, record, link, relationship) {
var type = relationship.type;
var parentId = record.get('id');
return store.findAll(relationship.type).then(function(children) {
var content = children.get('content');
var filteredContent = content.filter(function(child) {
return (child.get('id').indexOf(parentId) == 0);
});

// The children we return here are fully resolved with data.
var kid = filteredContent[0];
console.log('The findHasMany method is returning a kid with id :', kid.get('id'), ' name: ', kid.get('name'), ' grade:', kid.get('grade'));

return Ember.RSVP.resolve(filteredContent);
});
},

queryFixtures: function(fixtures, query, type) {
return fixtures;
}
});

漏洞

findHasMany 中,我的 App.Kid 实体已完全解析。它的所有数据都在那里。但是,在任何请求 parent 的 child 的其他代码中,App.Kid 模型有一个 ID 但没有其他数据。在我的演示中,这是在索引路由中演示的:

App.IndexRoute = Ember.Route.extend({
model: function() {
// Return the first kid of the first parent (in our data: the only kid)
return this.store.findAll('parent').then(function(parentRecords) {
var parent = parentRecords.get('content')[0];
return parent.get('kids').then(function(kids) {
return kids.get('content')[0];
});
});
},
setupController: function(controller, model) {
var id = model.get('id'),
name = model.get('name'),
grade = model.get('grade');

console.log('The model in setupController is returning a kid with id:', id, ' name: ', name, ' grade:', grade);

console.log('Is that model fully loaded?', model.get('isLoaded') ? 'yes': 'no');

controller.set('id', id);
controller.set('name', name);
controller.set('grade', grade);
}
});

预期行为

由于我们从自定义夹具适配器中的 store.findAll(U.Kid) 调用中获得了完全解析的 App.Kid 模型,我希望当我通过 hasMany 关系获得该模型时,完全解析的模型将出现。

环境

在 js fiddle 中:

DEBUG: Ember      : 1.6.1
DEBUG: Ember Data : 1.0.0-beta.8.2a68c63a
DEBUG: Handlebars : 1.0.0
DEBUG: jQuery : 1.8.3

在另一个环境中也是如此:

DEBUG: Ember      : 1.5.1
DEBUG: Ember Data : 1.0.0-beta.8.2a68c63a
DEBUG: Handlebars : 1.0.0
DEBUG: jQuery : 1.9.1

最佳答案

我想通了。问题出在我对 findHasMany 的实现中。系统需要一组原始数据对象,例如:

[{id: 'doe-jr', name: 'john jr', grade: '4th'}]

当我实际返回的是一组 App.Kid 模型时。

修改方法如下:

findHasMany: function(store, record, link, relationship) {
var type = relationship.type;
var parentId = record.get('id');
return store.findAll(relationship.type).then(function(children) {
var content = children.get('content');
var filteredContent = content.filter(function(child) {
return (child.get('id').indexOf(parentId) == 0);
});
// Fixed the issue by pulling out the raw data from the fixture model
// and returning that.
var data = filteredContent.map(function(content) {
return content.get('data');
});

return Ember.RSVP.resolve(data);
// Switch that return statement to the following to show original bug:
// return Ember.RSVP.resolve(filteredContent);
});
},

关于javascript - DS.FixtureAdapter 丢失具有 hasMany 异步属性的夹具数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25043438/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com