Ho un'applicazione SPA (durandaljs), e ho un percorso specifico in cui mappare "id" dell'entità che voglio recuperare.Breezejs EntityManager MetadataStore e fetchEntityByKey
Il modello è "/ #/todoDetail /: id".
Ad esempio, "/ #/todoDetail/232" o "/ #/todoDetail/19".
Sulla funzione di attivazione di viewmodel, ottengo le informazioni sul percorso in modo da poter prendere l'id. Quindi creo una nuova istanza di breezejs EntityManager per ottenere l'entità con l'id specificato.
Il problema è quando chiamo manager.fetchEntityByKey ("Todos", id), l'EntityManager non ha ancora i metadati dal server, quindi genera un'eccezione "Impossibile trovare un 'Tipo' con il nome: Todos".
Funziona solo se prima eseguo una query sullo store (manager.executeQuery), prima di chiamare fetchEntityByKey.
È un comportamento previsto o un bug? Esiste un modo per auto-correggere i metadati durante l'istanziazione di EntityManager?
nota: Credo che sia difficile utilizzare un EntityManager condiviso nel mio caso, perché voglio consentire all'utente di digitare direttamente il percorso sul browser.
EDIT: Come soluzione temporanea, sto facendo questo:
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);
}
};
buona congestione, quindi creerò entityManager con le fabbriche, condividendo metadati globali tra di loro. A proposito, ci sono possibilità di migliorare la brezza per aggiungere questa funzione, come un'istanza globale di metadatastore? Oppure forzare l'entitymanager a interrogare i metadati anche se desidero solo recuperare FeturnByKey, senza eseguire una query completa contro il servizio? –
Non sai cosa intendi. Non sono così entusiasta del MetadataStore di default definito da Breeze, ma è qualcosa che potresti facilmente creare da solo. Si può dire a MetadataStore di recuperare i dati metadati (ovviamente asincrona) a prescindere da una query (l'ho menzionata nella mia risposta). Si potrebbe anche guardare a 'EntityManager.createEmptyCopy'. Puoi chiamarlo sul tuo master EM per creare nuovi EM vuoti completamente configurati; il resto del tuo metodo factory importerebbe dal master solo quelle entità (ad es. elenchi di riferimento) che desideri nella copia. – Ward