2013-05-25 2 views
13

Я не могу запросить мои модели. Я не знаю, что я делаю неправильно.Невозможно запросить модель 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. 

ответ

21

Спасибо за помощь в попытке понять это.

Из того, что я смог собрать, метод 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; 
      }); 
     } 
    }) 
}); 
0

Я думаю, ваша проблема что у вас отсутствует префикс App, который вы уже определили, а такжеПрефиксдля данных 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" }); 

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

Надеется, что это помогает

+0

извините, я забыл изменить имена вещей при публикации. Я использовал RequireJS. По какой-то причине мне удалось вызвать find (некоторый id), но при вызове find ({property: 'query string'}) это не сработало. –

+0

вы можете попробовать 'App.Feature.findQuery ({name:" вспомогательная функция "})' – intuitivepixel

+0

Я использую Ember Cli в эти дни. используя реальный макетный сервер вместо адаптера адаптера. Я верю, что основная проблема была тогда, когда адаптер Fixture не поддерживал методы запросов из коробки. –

0

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

+0

Это становится для меня большим блокиратором. Может ли кто-нибудь указать мне в правильном направлении, как я могу попытаться выполнить запрос? –

+0

Данные Ember Data передают переданный ему объект серверу в виде параметров URL. Если вы хотите поддерживать запросы, вам нужно заставить свой сервер изменить свой ответ на основе параметров запроса, которые вы используете. – rpowell

30

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

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' 
}); 
+0

Я взял меня навсегда, чтобы узнать, что это причина, почему набор тестов интеграции ember не работает. – shredding