Ich habe eine SPA-Anwendung (durandaljs), und ich habe eine bestimmte Route, wo ich die "ID" der Entität zuordnen, die ich abrufen möchte.Breezejs EntityManager MetadataStore und fetchEntityByKey
Die Vorlage ist "/ #/todoDetail /: id".
Zum Beispiel "/ #/todoDetail/232" oder "/ #/todoDetail/19".
Bei der Aktivierung von Viewmodel, bekomme ich die Route Info, so kann ich die ID greifen. Dann erstelle ich eine neue Instanz von brisejs EntityManager, um die Entity mit der angegebenen ID zu erhalten.
Das Problem ist, wenn ich Manager.fetchEntityByKey ("Todos", ID) aufrufen, hat der EntityManager noch nicht die Metadaten vom Server, so dass es wirft "Unable zu finden 'Typ mit dem Namen: Todos ".
Es funktioniert nur, wenn ich zuerst eine Abfrage für den Speicher ausführen (manager.executeQuery), vor dem Aufruf von FetchEntityByKey.
Ist dies ein erwartetes Verhalten oder ein Fehler? Gibt es eine Möglichkeit, die Metadaten während der Instantiierung von EntityManager automatisch zu reparieren?
Hinweis: Ich glaube, dass es in meinem Fall schwierig ist, einen gemeinsamen EntityManager zu verwenden, da ich dem Benutzer erlauben möchte, die Route direkt im Browser einzugeben.
EDIT:
BreezeService.prototype.get = function (id, callback) {
var self = this;
function queryFailed(error) {
app.showMessage(error.message);
callback({});
}
/* first checking if metadatastore was already loaded */
if (self.manager.metadataStore.isEmpty()) {
return self.manager.fetchMetadata()
.then(function (rawMetadata) {
return executeQuery();
}).fail(queryFailed);
} else {
return executeQuery();
}
/* Now I can fetch */
function executeQuery() {
return self.manager.fetchEntityByKey(self.entityType, id, true)
.then(callback)
.fail(queryFailed);
}
};
gute suggestion, also werde ich entityManagers mit factories erstellen und globale Metadaten zwischen ihnen teilen. Übrigens, gibt es irgendwelche Chancen, die Brise zu verbessern, um diese Möglichkeit hinzuzufügen, wie eine globale Instanz von Metadatastore? Oder erzwinge dann EntityManager, Metadaten abzufragen, auch wenn ich nur fetchEntityByKey möchte, ohne eine vollständige Abfrage für den Service auszuführen? –
Nicht sicher, was du meinst. Ich bin nicht so scharf auf Breeze-definierten Standard MetadataStore, aber das ist etwas, was Sie leicht für sich selbst erstellen können. Sie können einem MetadataStore mitteilen, dass er Metadaten abrufen soll (das ist natürlich asynchron), abgesehen von einer Abfrage (ich erwähnte dies in meiner Antwort). Sie können auch "EntityManager.createEmptyCopy" betrachten. Sie können dies auf Ihrem Master-EM aufrufen, um neue leere EMs zu erstellen, die vollständig konfiguriert sind. Der Rest Ihrer Factory-Methode importiert nur solche Entitäten (z. B. Referenzlisten), die Sie in der Kopie verwenden möchten. – Ward