2013-05-25 3 views
13

Nie mogę wysłać zapytania do moich modeli. Nie wiem, co robię źle.Nie można wysłać zapytania do modelu Emberjsa przy użyciu narzędzia DS.FixtureAdapter

mam mój sklep zdefiniowany jako

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

A mój model zdefiniowany

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." 
    } 
]; 

Kiedy uruchomić następujące polecenie w wierszu poleceń

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

Odpowiedz

21

Dzięki za pomoc w podjęciu próby rozwiązania tego problemu.

Z tego, co udało mi się zebrać, metoda find() wywołuje metodę findQuery(), która wywołuje queryFixtures() w FixturesAdapter. Pomysł ten nie jest wdrażany, ponieważ programiści mogą rozszerzyć to, aby zaimplementować własne find() w celu zablokowania różnych wyników wyszukiwania. Dla podstawowego filtru parametru udało mi się to zrobić.

////// 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

Chyba twój problem brakuje Twojego prefiksu App, który już zdefiniowałeś, a takżePrefiksdla danych ember. Możesz także usunąć Feature.adapter = EmberData.FixtureAdapter.create();.

Edytowałem Twój kod (nie testowałem).

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." 
} 
]; 

Teraz kwerendy konkretny identyfikator należy użyć:

App.Feature.find(1); 

do zapytania o nieruchomości można zrobić:

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

to powinno działać.

Nadzieja pomaga

+0

przepraszam, Zapomniałem zmienić nazwy rzeczy podczas publikowania. Używałem RequireJS. Z jakiegoś powodu udało mi się wywołać find (jakiś identyfikator), ale podczas wywoływania find ({właściwość: 'ciąg zapytania'}), to nie zadziałało. –

+0

możesz wypróbować 'App.Feature.findQuery ({nazwa:" sub-funkcja "})' – intuitivepixel

+0

Używam Ember Cli w tych dniach. za pomocą prawdziwego serwera próbnego zamiast adaptera urządzenia. Uważam, że głównym problemem był wtedy adapter Fixture, który nie ma metod zapytań obsługiwanych po wyjęciu z pudełka. –

0

Problem jest to, że adapter urządzenie nie faktycznie realizować żadnych metod zapytania. Jeśli chcesz znaleźć rekord na podstawie jego identyfikatora, możesz po prostu zadzwonić pod numer App.Feature.find(id), ale wszystko, co jest bardziej skomplikowane, nie jest obsługiwane. Nawet z DS.RESTAdapter musisz zdefiniować własny interfejs zapytań na serwerze, aby zapytania działały poprawnie.

+0

To staje się dla mnie dużym blokerem. Czy ktoś może wskazać mi właściwy kierunek, w jaki sposób mogę wprowadzić zapytanie? –

+0

Dane Ember po prostu przekazują obiekt nadany na serwer w postaci parametrów URL. Jeśli chcesz obsługiwać zapytania, musisz zmusić serwer do zmiany odpowiedzi na podstawie parametrów zapytania, z których korzystasz. – rpowell

30

udało mi się rozwiązać wspomniany błąd przy użyciu odpowiedź David Lai, ale bez wysuwania z DS.Store (nowy sposób po 1.0.beta.1 Ember Danych):

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

Wziąłem mnie jak zawsze, aby dowiedzieć się, że to jest powód, dla którego pakiet testowy integracji ember nie działa. – shredding