2013-05-25 3 views
13

Ich kann meine Modelle nicht abfragen. Ich weiß nicht, was ich falsch mache.Kann Emberjs Model nicht abfragen, wenn DS.FixtureAdapter verwendet wird

Ich habe meinen Speicher definiert als

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

Und mein Modell definiert,

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

Wenn ich folgend in der Befehlszeile ausführen

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

Antwort

21

Vielen Dank für Ihre Hilfe bei dem Versuch, dies herauszufinden.

Von dem, was ich habe die find() Methode sammeln kann, ruft findQuery(), die queryFixtures() in dem FixturesAdapter nennt. Die Idee, dies nicht zu implementieren, besteht für Entwickler darin, dies zu erweitern, um ihre eigene find() zu implementieren, um verschiedene Suchergebnisse auszugeben. Für einen grundlegenden Filter auf Parameter konnte ich das einfach tun.

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

Ich denke, Ihr Problem ist dass Ihnen das Präfix App fehlt, das Sie bereits definiert haben, und auch das DS Präfix für Ember-Daten. Sie können auch Feature.adapter = EmberData.FixtureAdapter.create(); entfernen.

ich Ihren Code bearbeitet haben (nicht getestet).

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

nun eine spezifische ID abfragen Sie verwenden sollten:

App.Feature.find(1); 

Zur Abfrage von einer Eigenschaft, die Sie tun können:

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

Diese funktionieren sollte.

Hoffe, es hilft hier

+0

sorry, I habe vergessen, die Namen der Dinge beim Posten zu ändern. Ich benutzte RequireJS. Aus irgendeinem Grund konnte ich find (eine ID) aufrufen, aber beim Aufruf von find ({property: 'query string'}) funktionierte das nicht. –

+0

können Sie 'App.Feature.findQuery ({Name:" eine Unterfunktion "})' – intuitivepixel

+0

Ich benutze Ember Cli in diesen Tagen. Verwenden eines echten Scheinservers anstelle des Scheinadapters. Ich glaube, das Kernproblem war damals der Fixture-Adapter hatte keine Abfrage-Methoden aus der Box unterstützt. –

0

Das Problem ist, dass das Gerät Adapter tatsächlich keine Abfragemethoden implementieren. Wenn Sie einen Datensatz anhand seiner ID suchen möchten, rufen Sie einfach App.Feature.find(id) an, aber alles, was komplizierter ist, wird nicht unterstützt. Auch mit der DS.RESTAdapter müssen Sie eine eigene Abfrage-Schnittstelle auf dem Server definieren, um Abfragen ordnungsgemäß funktionieren zu lassen.

+0

Dies wird zu einem großen Blocker für mich. Kann mir jemand in die richtige Richtung zeigen, wie ich eine Abfrage implementieren kann? –

+0

Ember Data übergibt das übergebene Objekt einfach in Form von URL-Parametern an den Server. Wenn Sie Abfragen unterstützen möchten, müssen Sie die Antwort des Servers basierend auf den verwendeten Abfrageparametern ändern. – rpowell

30

ich es geschafft, die genannten Fehler zu lösen, indem David Lai Antwort verwenden, aber von DS.Store (die neue Art und Weise nach Ember Daten 1.0.beta.1) ohne Verlängerung:

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

Ich nahm mich für immer, um herauszufinden, dass dies der Grund ist, warum die Ember Integration Test Suite nicht läuft. – shredding

Verwandte Themen