Подтвердить что ты не робот

Невозможно запросить модель Emberjs при использовании DS.FixtureAdapter

Я не могу запросить мои модели. Я не знаю, что я делаю неправильно.

У меня есть мой магазин, определенный как

App.Store = DS.Store.extend({
        revision: 12,
        adapter: DS.FixtureAdapter
    });

И моя модель определена,

var Feature = DS.Model.extend({
    name: DS.attr('string'),
    description: DS.attr('string'),
    parent: DS.belongsTo('SimpleTestManager.Feature'),
    DS.belongsTo('SimpleTestManager.Project'),
    children: DS.hasMany('SimpleTestManager.Feature'),
    requirements: DS.attr('string')
});

App.Feature.adapter = DS.FixtureAdapter.create();

App.Feature.FIXTURES = [
    {
        id: 1,
        name: "my first feature",
        description: "some description",
        parent: null,
        project: 1,
        children:[2],
        requirements: "This is my first feature.  It has many requirements."
    },
    {
        id: 2,
        name: "a sub feature",
        description: "some sub feature.",
        parent: 1,
        project: 1,
        children:[],
        requirements: "This is a sub feature."
    }
];

Когда я запустил следующее в командной строке

>>App.Features.find({id:'1'})
Error: assertion failed: Not implemented: You must override the DS.FixtureAdapter::queryFixtures method to support querying the fixture store.
4b9b3361

Ответ 1

Спасибо за вашу помощь, пытаясь понять это.

Из того, что я смог собрать, метод find() вызывает findQuery(), который вызывает queryFixtures() в FixturesAdapter. Идея этого не внедряется для разработчиков, чтобы расширить это, чтобы реализовать свою собственную находку() для выполнения различных результатов поиска. Для базового фильтра по параметру я смог просто сделать это.

////// Stub data store fixture adapter ///////
App.Store = DS.Store.extend({
    revision: 12,
    //adapter: 'DS.RESTAdapter',
    adapter: DS.FixtureAdapter.extend({
        queryFixtures: function(fixtures, query, type) {
            console.log(query);
            console.log(type);
            return fixtures.filter(function(item) {
                for(prop in query) {
                    if( item[prop] != query[prop]) {
                        return false;
                    }
                }
                return true;
            });
        }
    })
});

Ответ 2

Мне удалось решить указанную ошибку, используя ответ Дэвида Лая, но без расширения от DS.Store(новый путь после Ember Data 1.0.b.1):

App.FixtureAdapter = DS.FixtureAdapter.extend({
  queryFixtures: function(records, query, type) {
    return records.filter(function(record) {
        for(var key in query) {
            if (!query.hasOwnProperty(key)) { continue; }
            var value = query[key];
            if (record[key] !== value) { return false; }
        }
        return true;
    });
  }
});


App.Store = DS.Store.extend({
  adapter: 'Fixture'
});

Ответ 3

Я думаю, ваша проблема в том, что у вас отсутствует префикс App, который вы уже определили, а также префикс DS для данных ember. Вы также можете удалить Feature.adapter = EmberData.FixtureAdapter.create();.

Я редактировал ваш код (не тестировался).

App.Store = DS.Store.extend({
    revision: 12,
    adapter: 'DS.FixtureAdapter'
});

App.Feature = DS.Model.extend({
  name: DS.attr('string'),
  description: DS.attr('string'),
  parent: DS.belongsTo('SimpleTestManager.Feature'),
  project:DS.belongsTo('SimpleTestManager.Project'),
  children: DS.hasMany('SimpleTestManager.Feature'),
  requirements: DS.attr('string')
});

App.Feature.FIXTURES = [
{
    id: 1,
    name: "my first feature",
    description: "some description",
    parent: null,
    project: 1,
    children:[2],
    requirements: "This is my first feature.  It has many requirements."
},
{
    id: 2,
    name: "a sub feature",
    description: "some sub feature.",
    parent: 1,
    project: 1,
    children:[],
    requirements: "This is a sub feature."
}
];

Теперь, чтобы запросить конкретный идентификатор, вы должны использовать:

App.Feature.find(1);

Чтобы запросить свойство, которое вы можете сделать:

App.Feature.findQuery({ name: "a sub feature" });

Это должно работать.

Надеюсь, что это поможет

Ответ 4

Проблема заключается в том, что адаптер адаптера фактически не реализует никаких методов запросов. Если вы хотите найти запись по ее идентификатору, вы можете просто вызвать App.Feature.find(id), но ничего сложнее, чем это не поддерживается. Даже с помощью DS.RESTAdapter вам необходимо определить свой собственный интерфейс запросов на сервере для правильной работы запросов.