Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript DS.FixtureAdapter会丢失具有许多异步属性的设备数据 背景_Javascript_Ember.js_Ember Data - Fatal编程技术网

Javascript DS.FixtureAdapter会丢失具有许多异步属性的设备数据 背景

Javascript DS.FixtureAdapter会丢失具有许多异步属性的设备数据 背景,javascript,ember.js,ember-data,Javascript,Ember.js,Ember Data,我已经向Ember数据团队提交了一份报告,但我希望了解如何解决这个问题(或者如果我一直都错了) 如果出现此错误,您可以看到正在运行的演示 问题 这里是问题的症结所在: 为了更清楚地解释,这里复制了代码 设置 我有以下数据模型,我想用夹具进行测试: App.Parent = DS.Model.extend({ name: DS.attr('name'), kids: DS.hasMany('kids', {async : true}) }); App.Kid = DS.Model.

我已经向Ember数据团队提交了一份报告,但我希望了解如何解决这个问题(或者如果我一直都错了)

如果出现此错误,您可以看到正在运行的演示

问题 这里是问题的症结所在: 为了更清楚地解释,这里复制了代码

设置 我有以下数据模型,我想用夹具进行测试:

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
实体已完全解析。它的所有数据都在那里。但是,在请求父母孩子的任何其他代码中,
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小提琴中:

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);
    });
},